Example #1
0
def run(im,
        mask=None,
        save_fig=False,
        smoothing=False,
        return_all=False,
        show=False,
        show_now=True,
        verbose=True):
    """
    im ... grayscale image
    """
    show = True  # debug show

    set_verbose(verbose)

    if mask is None:
        mask = np.ones_like(im)
    else:
        im, mask = tools.crop_to_bbox(im, mask)
        mean_v = int(im[np.nonzero(mask)].mean())
        im = np.where(mask, im, mean_v)
        # im = np.where(mask, im, 255)

    im_orig = im.copy()
    orig_shape = im_orig.shape[:-1]

    if smoothing:
        im = tools.smoothing(im)

    # intensity
    use_sigmoid = True
    morph_proc = True
    # consp_int = conspicuity_intensity(im, mask=mask, int_type='diff', type='hypo', use_sigmoid=use_sigmoid, show=show, show_now=False)
    # consp_int = conspicuity_intensity(im, mask=mask, int_type='hist', type='hypo', use_sigmoid=use_sigmoid, show=show, show_now=False)
    # consp_int = conspicuity_intensity(im, mask=mask, int_type='glcm', type='hypo', use_sigmoid=use_sigmoid, show=show, show_now=False)
    # consp_sliwin = conspicuity_sliding_window(im, mask=mask, pyr_scale=1.5, show=show, show_now=False)

    im = img_as_float(im)
    # id = conspicuity_intensity(im.copy(), mask=mask, int_type='diff', type='hypo', use_sigmoid=use_sigmoid, show=show, show_now=False)
    # plt.show()
    # id = conspicuity_calculation(im, sal_type='int_diff', mask=mask, calc_features=False, use_sigmoid=use_sigmoid, morph_proc=morph_proc, show=show, show_now=False)
    # id = conspicuity_calculation(im, sal_type='int_hist', mask=mask, calc_features=False, use_sigmoid=use_sigmoid, morph_proc=morph_proc, show=show, show_now=False)
    # id = conspicuity_calculation(im, sal_type='int_glcm', mask=mask, calc_features=False, use_sigmoid=use_sigmoid, morph_proc=morph_proc, show=show, show_now=False)
    # isw = conspicuity_calculation(im, sal_type='int_sliwin', mask=mask, calc_features=False, use_sigmoid=False, morph_proc=morph_proc, show=show, show_now=False)
    # it = conspicuity_calculation(im, sal_type='texture', mask=mask, calc_features=False, use_sigmoid=False, morph_proc=False, show=show, show_now=False)
    # circ = conspicuity_calculation(im, sal_type='circloids', mask=mask, calc_features=False, use_sigmoid=False, morph_proc=True, show=show, show_now=False)
    blobs = conspicuity_calculation(im,
                                    sal_type='blobs',
                                    mask=mask,
                                    calc_features=False,
                                    use_sigmoid=False,
                                    morph_proc=True,
                                    show=show,
                                    show_now=False)

    # TODO: Conspicuity ... ND verze

    if show:
        plt.show()
Example #2
0
    def run_segmentation(self, display=False):

        # mask = self.data_term(find_all=False)
        # mask = self.seeds.copy()

        # strel = skimor.disk(2)

        # ballM = np.zeros((2 * self.ball_r + 1, 2 * self.ball_r + 1, 2), dtype=np.int)
        # ballM[:, :, 1] = np.tile(np.arange(-self.ball_r, self.ball_r + 1), [2 * self.ball_r + 1, 1])
        # ballM[:, :, 0] = ballM[:, :, 1].conj().transpose()
        #
        # ballMOut = np.zeros((2 * self.ball_r_out + 1, 2 * self.ball_r_out + 1, 2), dtype=np.int)
        # ballMOut[:, :, 1] = np.tile(np.arange(-self.ball_r_out, self.ball_r_out + 1), [2 * self.ball_r_out + 1, 1])
        # ballMOut[:, :, 0] = ballMOut[:, :, 1].conj().transpose()

        # self.segmentation = self.segmentInnerBoundary(self.energy, mask, ballM, strel, self.min_diff, self.alpha, display)
        # self.membraneMask = skimor.binary_closing(self.membraneMask, strel)

        if self.smoothing:
            self.im = tools.smoothing(self.im, sigmaSpace=5, sigmaColor=5, sliceId=0)

        if scale != 1:
            self.im = tools.resize3D(self.im, self.scale, sliceId=0)
            self.seeds = tools.resize3D(self.seeds, self.scale, sliceId=0)
            self.segmentation = tools.resize3D(self.segmentation, self.scale, sliceId=0)

        newbies = self.seeds.copy()
        curr_it = 0
        changed = True
        while changed and curr_it < self.max_iters:
            curr_it += 1
            print 'iteration #%i/%i' % (curr_it, self.max_iters)
            #            mask, accepted, refused = self.iterationIB( im, mask, ballM, strel, minDiff, alpha )
            mask_new, accepted, refused = self.iteration_IB(newbies)
            # plt.figure()
            # plt.subplot(121), plt.imshow(self.segmentation[0,...].copy(), 'gray')
            # plt.subplot(122), plt.imshow(mask_new[0,...].copy(), 'gray')
            # if (curr_it % 2) == 0:
            #     plt.show()
            # newbies = mask_new - self.segmentation
            # mask = mask_new
            self.segmentation = mask_new
            #            self.newbies = np.zeros( self.newbies.shape, dtype=np.bool )
            #            self.newbies[accepted[0],accepted[1]] = True

            if not accepted.any():
                changed = False

        for i, im in enumerate(self.segmentation):
            self.segmentation[i,...] = skimor.binary_closing(im, np.ones((3, 3)))
            # self.segmentation[i,...] = scindimor.binary_closing(self.segmentation, np.ones((3, 3, 3)))

        # rescale the segmentation to original shape
        if scale != 1:
            tmp = np.zeros(self.orig_shape)
            for i, im in enumerate(self.segmentation):
                tmp[i,...] = cv2.resize(im.astype(np.uint8), (self.orig_shape[2], self.orig_shape[1]))
            self.segmentation = tmp
Example #3
0
def run(image, mask=None, smoothing=False, show=False, show_now=True):
    if mask is None:
        mask = np.ones_like(image)
        im_orig = image.copy()
    else:
        image, mask = tools.crop_to_bbox(image, mask)
        im_orig = image.copy()
        mean_v = int(image[np.nonzero(mask)].mean())
        image = np.where(mask, image, mean_v)
    mask = mask.astype(np.uint8)

    if smoothing:
        image = tools.smoothing(image)

    # defaultne hleda svetle oblasti
    image = np.invert(image)

    rgb_image = cv2.cvtColor(image, cv2.COLOR_BAYER_GR2RGB).astype(np.float32)

    # print 'Calculate saliency map for test image:'
    orgb_image = SightSpotUtil.eval_orgb_image(rgb_image)

    # start = time.clock()
    saliency_map = SightSpotUtil.eval_saliency_map(orgb_image, 1.0, 40.0, 'auto')
    # print 'Saliency map extracted in', time.clock() - start, 'sec.'

    # start = time.clock()
    # heatmap_image = SightSpotUtil.eval_heatmap(saliency_map)
    # heatmap_image = np.asarray(heatmap_image)
    # heatmap_image.setflags(write=True)
    # print 'Heatmap extracted in', time.clock() - start, 'sec.'

    saliency_map *= mask
    # heatmap_image *= np.dstack((mask, mask, mask))
    im_orig *= mask

    saliency_map = skiexp.rescale_intensity(saliency_map, out_range=(0, 1))

    if show:
        if smoothing:
            plt.subplot(131), plt.imshow(im_orig, 'gray', interpolation='nearest'), plt.title('input')
            plt.subplot(132), plt.imshow(image, 'gray', interpolation='nearest'), plt.title('smoothed')
            plt.subplot(133), plt.imshow(saliency_map, 'gray', interpolation='nearest'), plt.title('saliency')
        else:
            plt.subplot(121), plt.imshow(im_orig, 'gray', interpolation='nearest'), plt.title('input')
            plt.subplot(122), plt.imshow(saliency_map, 'gray', interpolation='nearest'), plt.title('saliency')
        if show_now:
            plt.show()

    return im_orig, image, saliency_map
Example #4
0
def blob_from_hist(data, show=False, show_now=True, min_int=0, max_int=255):
    data = tools.windowing(data, sliceId=0)
    data = tools.resize_ND(data, scale=0.1).astype(np.uint8)
    data = tools.smoothing(data, sliceId=0)

    min_interval = int((0 + 125) / 350. * 255)
    max_interval = int((100 + 125) / 350. * 255)

    mask = np.ones_like(data)
    mask = np.where(data < 5, 0, mask)
    mask = np.where(data > 250, 0, mask)
    pts = data[np.nonzero(mask)]
    hist, bins = skiexp.histogram(pts)
    hist = tools.hist_smoothing(bins, hist)
    # bins = bins / 255 * 350 - 125

    hist_rec = np.zeros_like(hist)
    hist_rec[min_interval:max_interval] = hist[min_interval:max_interval]
    peak_idx = np.argmax(hist_rec)
    hist_ind = bins[peak_idx]

    hist_hu = hist_ind / 255 * 350 - 125
    print 'hist ind: %.1f = %i HU' % (hist_ind, int(hist_hu))

    if show:
        plt.figure()
        plt.plot(bins, hist, 'b-', lw=4)
        plt.plot((min_interval, min_interval), (0, 1.2 * hist_rec.max()),
                 'm-',
                 lw=4)
        plt.plot((max_interval, max_interval), (0, 1.2 * hist_rec.max()),
                 'm-',
                 lw=4)
        plt.plot(hist_ind, hist[peak_idx], 'go', markersize=12)

        img = data[21, ...]
        hist_diff = abs(img.astype(np.int64) - hist_ind)
        plt.figure()
        plt.subplot(121), plt.imshow(img, 'gray',
                                     interpolation='nearest'), plt.axis('off')
        plt.subplot(122), plt.imshow(hist_diff,
                                     'gray',
                                     interpolation='nearest'), plt.axis('off')

        if show_now:
            plt.show()

    return hist_ind
Example #5
0
def run(image, mask=None, smoothing=False, show=False, show_now=True):
    if mask is None:
        mask = np.ones_like(image)
        im_orig = image.copy()
    else:
        image, mask = tools.crop_to_bbox(image, mask)
        im_orig = image.copy()
        mean_v = int(image[np.nonzero(mask)].mean())
        image = np.where(mask, image, mean_v)
    mask = mask.astype(np.uint8)

    if smoothing:
        image = tools.smoothing(image)

    rgb_image = cv2.cvtColor(image, cv2.COLOR_BAYER_GR2BGR).astype(np.float32)
    imgsize = rgb_image.shape
    img_width = imgsize[1]
    img_height = imgsize[0]
    sm = pySaliencyMap.pySaliencyMap(img_width, img_height)
    saliency_map = sm.SMGetSM(rgb_image)

    saliency_map *= mask.astype(np.uint8)
    im_orig *= mask.astype(np.uint8)

    saliency_map = skiexp.rescale_intensity(saliency_map, out_range=(0, 1))

    if show:
        plt.figure(figsize=(24, 14))
        if smoothing:
            plt.subplot(131), plt.imshow(
                im_orig, 'gray', interpolation='nearest'), plt.title('input')
            plt.subplot(132), plt.imshow(
                image, 'gray', interpolation='nearest'), plt.title('smoothed')
            plt.subplot(133), plt.imshow(
                saliency_map, 'gray',
                interpolation='nearest'), plt.title('saliency')
        else:
            plt.subplot(121), plt.imshow(
                im_orig, 'gray', interpolation='nearest'), plt.title('input')
            plt.subplot(122), plt.imshow(
                saliency_map, 'gray',
                interpolation='nearest'), plt.title('saliency')
        if show_now:
            plt.show()

    return im_orig, image, saliency_map
Example #6
0
def analyze_im_for_features(fn, show=True, show_now=True):
    mask_fn = fn.replace('.%s' % (fn.split('.')[-1]), '_mask.%s' % (fn.split('.')[-1]))
    im = cv2.imread(fn, 0)
    ims = tools.smoothing(im, d=10, sigmaColor=50, sigmaSpace=10)
    mask = cv2.imread(mask_fn, 0) > 0
    pts = ims[np.nonzero(mask)]

    # fuz.fcm(ims, mask=mask, n_clusters=2, show=True)
    # color_clustering(ims, mask=mask, k=2)

    hist, bins = skiexp.histogram(pts)
    glcm = tools.graycomatrix_3D(ims, mask=mask)
    # glcm *= glcm > 3

    # glcm_p = glcm > (0.4 * glcm.max())
    glcm_p = glcm > 2 * (glcm[np.nonzero(glcm)].mean())
    # glcm_p = glcm > (np.median(glcm[np.nonzero(glcm)]))
    glcm_pts = np.nonzero(glcm_p)
    width = glcm_pts[1].max() - glcm_pts[1].min()

    plt.figure()
    plt.subplot(121), plt.imshow(glcm)
    plt.subplot(122), plt.imshow(glcm_p, 'gray')
    # plt.show()

    mu, std = scista.norm.fit(pts.flatten())
    # b = scista.norm.pdf(bins, mu, std)
    # k = hist.max() / b.max()
    # plt.figure()
    # plt.plot(bins, hist, 'b-')
    # plt.plot(bins, k * b, 'r-')
    # plt.show()

    if show:
        plt.figure()
        plt.suptitle('std=%.2f, width=%i' % (std, width))
        plt.subplot(131), plt.imshow(skiseg.mark_boundaries(im, mask, color=(1,0,0), mode='thick'), 'gray', interpolation='nearest')
        # plt.subplot(142), plt.imshow(mask, 'gray', interpolation='nearest')
        plt.subplot(132), plt.plot(bins, hist, 'b-')
        plt.xlim([0, 255])
        plt.subplot(133), plt.imshow(glcm, interpolation='nearest')#, vmax=5 * glcm.mean())
        if show_now:
            plt.show()

    return bins, hist, glcm
Example #7
0
def run(image,
        mask,
        pyr_scale,
        method,
        smooth=True,
        show=False,
        show_now=True,
        save_fig=False):
    # fig_dir = '/home/tomas/Dropbox/Work/Dizertace/figures/saliency/%s/' % method
    # if save_fig:
    #     dirs = fig_dir.split('/')
    #     for i in range(2, len(dirs)):
    #         subdir = '/'.join(dirs[:i])
    #         if not os.path.exists(subdir):
    #             os.mkdir(subdir)

    image, mask = tools.crop_to_bbox(image, mask)
    if smooth:
        image = tools.smoothing(image, sliceId=0)

    pyr_keypts = []
    # pyr_survs = []
    # pyr_titles = []
    pyr_imgs = []
    pyr_masks = []
    for layer_id, (im_pyr, mask_pyr) in enumerate(
            zip(tools.pyramid(image, scale=pyr_scale, inter=cv2.INTER_NEAREST),
                tools.pyramid(mask, scale=pyr_scale,
                              inter=cv2.INTER_NEAREST))):
        resp = detect_keypoints(im_pyr,
                                mask_pyr,
                                method,
                                layer_id=layer_id,
                                smooth=smooth,
                                show=show,
                                show_now=show_now,
                                save_fig=save_fig)

        pyr_keypts.append(resp)
        pyr_imgs.append(im_pyr)
        pyr_masks.append(mask_pyr)

    n_layers = len(pyr_imgs)
Example #8
0
def morph_hat_test(im):
    im = tools.windowing(im)
    im = tools.smoothing(im)

    min_size = 11
    max_size = 31
    strels = []
    for i in range(min_size, max_size + 1, 6):
        strels.append(cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (i, i)))
    tophats = tools.morph_hat(im, strels, show=True, show_now=False)

    min_size = 41
    max_size = 61
    strels = []
    for i in range(min_size, max_size + 1, 6):
        strels.append(cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (i, i)))

    blackhats = tools.morph_hat(im,
                                strels,
                                type='blackhat',
                                show=True,
                                show_now=True)
Example #9
0
def run(im_in,
        slice=None,
        mask=None,
        smoothing=True,
        method='sfm',
        max_iters=1000,
        rad=10,
        alpha=0.2,
        scale=1.,
        init_scale=0.5,
        sigma=1,
        smoothing_ls=1,
        threshold=0.3,
        balloon=1,
        show=False,
        show_now=True,
        save_fig=False,
        verbose=True):
    im = im_in.copy()
    if smoothing:
        im = tools.smoothing(im, sigmaSpace=10, sigmaColor=10, sliceId=0)
    # init_mask = initialize(im, dens_min=50, dens_max=200, show=True, show_now=False)[0,...]
    if mask is None:
        # mask = initialize_graycom(im, [1, 2], scale=1, show=show, show_now=show_now)
        mask = tools.initialize_graycom(im,
                                        slice,
                                        distances=[
                                            1,
                                        ],
                                        scale=init_scale,
                                        show=show,
                                        show_now=show_now)
    # else:
    #     im_init = im

    if method == 'morphsnakes':
        _debug(' Morph snakes ...', verbose, False)
        im, mask, seg = morph_snakes(im,
                                     mask,
                                     scale=scale,
                                     alpha=int(alpha),
                                     sigma=sigma,
                                     smoothing_ls=smoothing_ls,
                                     threshold=threshold,
                                     balloon=balloon,
                                     max_iters=max_iters,
                                     slice=slice,
                                     show=show,
                                     show_now=show_now)
        _debug('done', verbose)
    elif method in ['sfm', 'lls']:
        _debug('SFM ...', verbose, False)
        im, mask, seg = lankton_ls(im,
                                   mask,
                                   method=method,
                                   max_iters=max_iters,
                                   rad=rad,
                                   alpha=alpha,
                                   scale=scale,
                                   slice=slice,
                                   show=show,
                                   show_now=show_now)
        _debug('done', verbose)
    return im, mask, seg
Example #10
0
def blob_from_glcm(data, show=False, show_now=True, min_int=0, max_int=255):
    data = tools.windowing(data, sliceId=0)
    data_f = tools.resize_ND(data, scale=0.1).astype(np.uint8)
    data_f = tools.smoothing(data_f, sliceId=0)

    min_interval = int((0 + 125) / 350. * 255)
    max_interval = int((100 + 125) / 350. * 255)
    # min_int = 20
    # max_int = 80

    print 'calculating glcm ...',
    glcm = tools.graycomatrix_3D(data_f)
    print 'done'

    glcm_rec = glcm.copy()
    mask = np.zeros_like(glcm_rec)
    mask[min_interval:max_interval, min_interval:max_interval] = 1
    glcm_rec *= mask
    max_r, max_c = np.unravel_index(np.argmax(glcm_rec), glcm_rec.shape)
    glcm_ind = (max_r + max_c) / 2

    glcm_hu = glcm_ind / 255 * 350 - 125
    print 'glcm ind: %.1f = %i HU' % (glcm_ind, int(glcm_hu))

    img = data[21, ...]

    if show:
        plt.figure()
        plt.subplot(121), plt.imshow(glcm,
                                     interpolation='nearest',
                                     vmax=5 * glcm.mean())
        plt.subplot(122), plt.imshow(glcm,
                                     interpolation='nearest',
                                     vmax=5 * glcm.mean())
        plt.plot((min_interval, min_interval), (min_interval, max_interval),
                 'm-',
                 lw=5)
        plt.plot((min_interval, max_interval), (max_interval, max_interval),
                 'm-',
                 lw=5)
        plt.plot((max_interval, max_interval), (max_interval, min_interval),
                 'm-',
                 lw=5)
        plt.plot((max_interval, min_interval), (min_interval, min_interval),
                 'm-',
                 lw=5)
        plt.plot(max_c, max_r, 'wo', markersize=12)
        plt.axis('image')

        glcm_diff = abs(img.astype(np.int64) - glcm_ind)
        plt.figure()
        plt.subplot(121), plt.imshow(img, 'gray',
                                     interpolation='nearest'), plt.axis('off')
        plt.subplot(122), plt.imshow(glcm_diff,
                                     'gray',
                                     interpolation='nearest'), plt.axis('off')

        if show_now:
            plt.show()

    return glcm_ind
Example #11
0
def process_slice(img_o, mask_o, proc, show=False, show_now=False, t=0.2):
    if not mask_o.any():
        return np.zeros_like(img_o), None

    img_bbox, mask = tools.crop_to_bbox(img_o, mask_o)

    # write mean value outside the mask
    mean_val = np.mean(img_bbox[np.nonzero(mask)])
    img = np.where(mask, img_bbox, mean_val)

    # rescale to UINT8
    img = skiexp.rescale_intensity(img,
                                   in_range=(50 - 175, 50 + 175),
                                   out_range=np.uint8).astype(np.uint8)

    vis = []
    img_pipe = img.copy()
    seg = None  # final segmentation

    # saving input and input with liver borders
    # vis.append(('input', img_o))
    # liver_contours = skimea.find_contours(mask_o, 0.9)
    # vis.append(('liver contours', (img_o, liver_contours)))

    # smoothing
    if 'smo' in proc or 'smoothing' in proc:
        img_s = tools.smoothing(img)
        img_pipe = img_s.copy()
        # img_pipe_o = tools.put_bbox_back(np.zeros_like(img_pipe_o), img_pipe, mask=mask_o)
        vis.append(('smoothing', img_s * mask))

    # # write mean value outside the mask
    # mean_val = np.mean(img_pipe[np.nonzero(mask)])
    # img_pipe = np.where(mask, img_pipe, mean_val)

    # Equalization
    if 'equ' in proc or 'equalization' in proc:
        img_h = skiexp.equalize_hist(img_pipe)
        img_pipe = img_h.copy()
        # img_pipe_o = tools.put_bbox_back(np.zeros_like(img_pipe_o), img_pipe, mask=mask_o)
        vis.append(('equalization', img_h * mask))

    # canny edge detector
    # canny = tools.auto_canny(skiexp.rescale_intensity(img_eq, out_range=np.uint8).astype(np.uint8), sigma=0.1)

    # contrast stretch
    if 'str' in proc or 'stretch' in proc:
        p = (20, 40)
        pmin, pmax = np.percentile(img_pipe, p)
        img_rescale = skiexp.rescale_intensity(img_pipe, in_range=(pmin, pmax))
        img_pipe = img_rescale.copy()
        vis.append(('stretch {}'.format(p), img_rescale * mask))

    # morphology
    if 'clo' in proc or 'closing' in proc:
        r = 7
        img_morph = skimor.closing(img_pipe, selem=skimor.disk(r))
        img_pipe = img_morph.copy()
        seg = tools.put_bbox_back(np.zeros(img_o.shape),
                                  img_pipe < t,
                                  mask=mask_o)
        vis.append(('closing r=%i' % r, img_morph * mask))

    # contours
    if 'con' in proc or 'contours' in proc:
        contours = skimea.find_contours(img_pipe, t)
        vis.append(('contours', (img_bbox, contours)))

    # plt.figure()
    # plt.subplot(121), plt.imshow(img_morph, 'gray'), plt.colorbar()
    # plt.subplot(122), plt.imshow(seg, 'gray'), plt.colorbar()
    # plt.show()

    if show:
        n_rows, n_cols = [1, len(vis)]
        plt.figure()
        for i, (title, im) in enumerate(vis):
            plt.subplot(n_rows, n_cols, i + 1)
            if 'contours' in title:
                # plt.imshow(vis[0][1], 'gray', interpolation='nearest'), plt.title(title)
                plt.imshow(im[0], 'gray',
                           interpolation='nearest'), plt.title(title)
                plt.hold(True)
                for n, contour in enumerate(im[1]):
                    plt.plot(contour[:, 1], contour[:, 0], linewidth=2)
                plt.axis('image')
            else:
                plt.imshow(im, 'gray',
                           interpolation='nearest'), plt.title(title)

        # if 'con' in proc or 'contours' in proc:
        #     for n, contour in enumerate(contours):
        #         plt.plot(contour[:, 1], contour[:, 0], linewidth=2)
        #     plt.axis('image')

        if show_now:
            plt.show()

    return seg, vis
Example #12
0
def run(im, mask, alpha=1, beta=1, scale=0.5, show=False, show_now=True, save_fig=False, verbose=True):
    # scale = 0.5  # scaling parameter for resizing the image
    # alpha = 1  # parameter for weighting the smoothness term (pairwise potentials)
    # beta = 1  # parameter for weighting the data term (unary potentials)

    set_verbose(verbose)
    figdir = '/home/tomas/Dropbox/Work/Dizertace/figures/mrf'

    _debug('Calculating saliency maps...')
    im_orig, image, salaki_map = salaki.run(im, mask)
    im_orig, image, salgoo_map = salgoo.run(im, mask=mask)
    im_orig, _, salik_map = salik.run(im, mask=mask, smoothing=True)
    im_orig, image, salmay_map = salmay.run(im, mask=mask, smoothing=True)

    # inverting intensity so that the tumor has high saliency
    # salgoo_map = np.where(salgoo_map, 1 - salgoo_map, 0)
    # salik_map = skiexp.rescale_intensity(salik_map, out_range=(0, 1))

    saliencies = [salaki_map, salgoo_map, salik_map, salmay_map]
    t**s = ['akisato', 'google', 'ik', 'mayo']
    # saliencies = [salaki_map, salgoo_map, salmay_map]
    # t**s = ['akisato', 'google', 'mayo']

    # plt.figure()
    # for i, (im, tit) in enumerate(zip(saliencies, t**s)):
    #     # plt.subplot(2, 2, i+1), plt.imshow(skiexp.rescale_intensity(im, out_range=(0, )), 'gray', interpolation='nearest')
    #     plt.subplot(2, 2, i+1), plt.imshow(im, 'gray', interpolation='nearest')
    #     plt.colorbar()
    #     plt.title(tit)
    # plt.show()

    im_bb, mask_bb = tools.crop_to_bbox(im, mask)

    im_bb = tools.smoothing(im_bb, sliceId=0)

    _debug('Creating MRF object...')
    mrf = MarkovRandomField(im_bb, mask=mask_bb, models_estim='hydohy', alpha=alpha, beta=beta, scale=scale, verbose=False)
    mrf.params['unaries_as_cdf'] = 1
    mrf.params['perc'] = 30
    mrf.params['domin_simple_estim'] = 0
    mrf.params['prob_w'] = 0.1

    # mrf.set_unaries(mrf.get_unaries())
    unaries, probs = mrf.get_unaries(ret_prob=True)

    unaries_l = [unaries[:, :, x].reshape(im_bb.shape) * mask_bb for x in range(unaries.shape[-1])]
    probs_l = [probs[:, :, x].reshape(im_bb.shape) * mask_bb for x in range(probs.shape[-1])]

    if show:
        tools.arange_figs(unaries_l, t**s=['unaries hypo', 'unaries domin', 'unaries hyper'], max_r=1, colorbar=True, same_range=False, show_now=False)
        tools.arange_figs(probs_l, t**s=['prob hypo', 'prob domin', 'prob hyper'], max_r=1, colorbar=True, same_range=False, show_now=True)

    # res = mrf.run(resize=False)
    # res = res[0, :, :]
    # res = np.where(mask_bb, res, -1) + 1

    # plt.figure()
    # plt.subplot(121), plt.imshow(im_bb, 'gray'), plt.colorbar()
    # plt.subplot(122), plt.imshow(res, 'jet', interpolation='nearest')
    # plt.colorbar(ticks=range(mrf.n_objects + 1))
    # # mrf.plot_models(show_now=False)
    # plt.show()

    # unaries2 = mrf.get_unaries()
    # mrf.set_unaries(unaries2)
    # res2 = mrf.run(resize=False)
    # res2 = res2[0, :, :]
    # res2 = np.where(mask_bb, res2, -1) + 1
    #
    # plt.figure()
    # plt.subplot(121), plt.imshow(im_bb, 'gray'), plt.colorbar()
    # plt.subplot(122), plt.imshow(res2, 'jet', interpolation='nearest')
    # plt.colorbar(ticks=range(mrf.n_objects + 1))
    # plt.show()


    # plt.figure()
    # plt.subplot(221), plt.imshow(im_orig, 'gray', interpolation='nearest'), plt.title('input')
    # plt.subplot(222), plt.imshow(res, interpolation='nearest'), plt.title('result')
    # plt.subplot(223), plt.imshow(mrf.get_unaries[:, 0, 0].reshape(im_orig.shape), 'gray', interpolation='nearest')
    # plt.colorbar(), plt.title('unary #1')
    # plt.subplot(224), plt.imshow(mrf.get_unaries[:, 0, 1].reshape(im_orig.shape), 'gray', interpolation='nearest')
    # plt.colorbar(), plt.title('unary #2')
    # plt.show()

    unary_domin = mrf.get_unaries()[:, :, 1]
    max_prob = unary_domin.max()

    # plt.figure()
    # plt.subplot(121), plt.imshow(im_bb, 'gray')
    # plt.subplot(122), plt.imshow(unary_domin.reshape(im_bb.shape), 'gray', interpolation='nearest')
    # plt.show()

    # rescaling intensities
    # max_int = 0.5
    max_int = max_prob
    saliencies_inv = []
    for i, im in enumerate(saliencies):
        saliencies[i] = skiexp.rescale_intensity(im, out_range=(0, max_int)).astype(unary_domin.dtype)
        saliencies_inv.append(skiexp.rescale_intensity(im, out_range=(max_int, 0)).astype(unary_domin.dtype))

    # if scale != 0:
    #     for i, im in enumerate(saliencies):
    #         saliencies[i] = tools.resize3D(im, scale, sliceId=0)

    unaries_domin_sal = [np.dstack((unary_domin, x.reshape(-1, 1))) for x in saliencies_inv]
    # unaries_domin_sal = [np.dstack((y.reshape(-1, 1), x.reshape(-1, 1))) for y, x in zip(saliencies, saliencies_inv)]


    alphas = [1, 10, 100]
    beta = 1
    for alpha in alphas:
        mrf = MarkovRandomField(im_bb, mask=mask_bb, models_estim='hydohy', alpha=alpha, beta=beta, scale=scale,
                                verbose=False)
        results = []
        for i, unary in enumerate(unaries_domin_sal):
            _debug('Optimizing MRF with unary term: %s' % t**s[i])
            # mrf.set_unaries(unary.astype(np.int32))
            mrf.alpha = alpha
            mrf.beta = beta
            mrf.models = []
            mrf.set_unaries(unary)
            res = mrf.run(resize=False)
            res = res[0, :, :]
            res = np.where(mask_bb, res, -1)

            # morphology
            lbl_obj = 1
            lbl_dom = 0
            rad = 5
            res_b = res == lbl_obj
            res_b = skimor.binary_opening(res_b, selem=skimor.disk(rad))
            res = np.where(res_b, lbl_obj, lbl_dom)
            res = np.where(mask_bb, res, -1)

            results.append(res.copy())

            if show:
                fig = plt.figure(figsize=(24, 14))
                plt.subplot(141), plt.imshow(im_orig, 'gray', interpolation='nearest'), plt.title('input')
                plt.subplot(142), plt.imshow(res, interpolation='nearest'), plt.title('result - %s' % t**s[i])
                plt.subplot(143), plt.imshow(unary[:, 0, 0].reshape(im_orig.shape), 'gray', interpolation='nearest')
                plt.title('unary #1')
                plt.subplot(144), plt.imshow(unary[:, 0, 1].reshape(im_orig.shape), 'gray', interpolation='nearest')
                plt.title('unary #2')

                if save_fig:
                    figname = 'unary_%s_alpha_%i_rad_%i.png' % (t**s[i], alpha, rad)
                    fig.savefig(os.path.join(figdir, figname), dpi=100, bbox_inches='tight', pad_inches=0)
            # plt.show()

        # mrf.set_unaries(unaries)
        # unaries =
        # mrf.run()
        # return mrf.labels_orig

        fig = plt.figure(figsize=(24, 14))
        n_imgs = 1 + len(saliencies)
        plt.subplot(2, n_imgs, 1)
        plt.imshow(im_orig, 'gray', interpolation='nearest'), plt.title('input')
        for i in range(len(saliencies)):
            plt.subplot(2, n_imgs, i + 2)
            plt.imshow(saliencies[i], 'gray', interpolation='nearest')
            plt.title(t**s[i])
        for i, r in enumerate(results):
            plt.subplot(2, n_imgs, i + n_imgs + 2)
            plt.imshow(results[i], interpolation='nearest'), plt.title('result - %s' % t**s[i])

        figname = 'unary_saliencies_alpha_%i_rad_%i.png' % (alpha, rad)
        fig.savefig(os.path.join(figdir, figname), dpi=100, bbox_inches='tight', pad_inches=0)

    plt.show()
Example #13
0
def contour_test(img, mask):
    img, mask = tools.crop_to_bbox(img, mask)

    img_o = img.copy()

    # write mean value outside the mask ----------------------------------------
    mean_val = np.mean(img[np.nonzero(mask)])

    img = np.where(mask, img, mean_val)

    # rescale to UINT8 ---------------------------------------------------------
    img = skiexp.rescale_intensity(img, out_range=np.uint8).astype(np.uint8)

    # smoothing ----------------------------------------------------------------
    img = tools.smoothing(img)

    # Contrast stretching -----------------------------------------------------
    # ps = [(2, 98), (5, 95), (10, 90), (20, 80)]
    ps = [(10, 40), (10, 90)]
    imgs_rescale = []
    for p in ps:
        pmin, pmax = np.percentile(img, p)
        imgs_rescale.append(
            skiexp.rescale_intensity(img, in_range=(pmin, pmax)))

    # Equalization --------------------------------------------------------------
    img_eq = skiexp.equalize_hist(img)

    # canny edge detector -----------------------------------------------------
    canny_s = tools.auto_canny(img, sigma=0.05)
    cannys_res = []
    for i in imgs_rescale:
        cannys_res.append(tools.auto_canny(i, sigma=0.1))
    canny_eq = tools.auto_canny(skiexp.rescale_intensity(
        img_eq, out_range=np.uint8).astype(np.uint8),
                                sigma=0.1)

    # morphology -------------------------------------------------------------
    img_eq_morph = skimor.closing(img_eq, selem=skimor.disk(7))
    # img_eq_morph = skimor.closing(imgs_rescale[0], selem=skimor.disk(7))
    # plt.figure()
    # plt.subplot(121), plt.imshow(img_eq, 'gray', interpolation='nearest'), plt.title('img equalized')
    # plt.subplot(122), plt.imshow(img_eq_morph, 'gray', interpolation='nearest'), plt.title('closed')
    # plt.show()

    # contours ----------------------------------------------------------------
    contours = skimea.find_contours(img_eq_morph, 0.2)
    # plt.figure()
    # plt.imshow(img_eq_morph, 'gray', interpolation='nearest')
    # for n, contour in enumerate(contours):
    #     plt.plot(contour[:, 1], contour[:, 0], linewidth=2)
    # plt.axis('image')
    # plt.show()

    # TODO: zkusit contury na canny a primo na im_eq

    vmin = 50 - 175
    vmax = 50 + 175
    plt.figure()
    plt.imshow(img_o, 'gray', interpolation='nearest', vmin=vmin, vmax=vmax)

    for (im, p) in zip(imgs_rescale, ps):
        plt.figure()
        plt.subplot(121), plt.imshow(im, 'gray',
                                     interpolation='nearest'), plt.title(
                                         'contrast stretching - {}'.format(p))
        plt.subplot(122), plt.imshow(
            skimor.closing(im, selem=skimor.disk(3)),
            'gray',
            interpolation='nearest'), plt.title('closing')

    plt.figure()
    plt.imshow(img_eq, 'gray', interpolation='nearest')
    plt.title('equalization')

    # PLOT CANNY -------------------------------------------
    # plt.figure()
    # plt.imshow(canny_s, 'gray', interpolation='nearest')
    # plt.title('canny - smoothed')

    # for (im, p) in zip(cannys_res, ps):
    #     plt.figure()
    #     plt.imshow(im, 'gray', interpolation='nearest')
    #     plt.title('canny - contrast stretching - {}'.format(p))

    # plt.figure()
    # plt.imshow(canny_eq, 'gray', interpolation='nearest')
    # plt.title('canny - equalization')

    plt.show()
Example #14
0
def run_all(image,
            mask,
            pyr_scale=2.,
            show=False,
            show_now=True,
            save_fig=False,
            show_indi=False,
            show_now_indi=True,
            save_fig_indi=False,
            verbose=True):
    blob_types = [BLOB_DOG, BLOB_LOG, BLOB_DOH, BLOB_CV]
    # blob_types = [BLOB_DOG, BLOB_CV]
    n_types = len(blob_types)
    survs = []
    fig_dir = '/home/tomas/Dropbox/Work/Dizertace/figures/blobs/'

    image, mask = tools.crop_to_bbox(image, mask)
    image = tools.smoothing(image, sliceId=0)

    for blob_type in blob_types:
        # print 'Calculating %s ...' % blob_type,
        surv_overall, survs_pyr, pyr_imgs, pyr_masks = run(
            image,
            mask,
            pyr_scale=pyr_scale,
            blob_type=blob_type,
            show=show_indi,
            show_now=show_now_indi,
            save_fig=save_fig_indi,
            verbose=verbose)
        surv_layers = [s[0] for s in survs_pyr]
        survs.append((surv_overall, surv_layers, blob_type))
        # print 'done'

    # survival image - overall
    survs_overall = np.zeros(image.shape)
    for surv_str in survs:
        surv = surv_str[0]
        if surv.shape != survs_overall.shape:
            surv = cv2.resize(surv, survs_overall.shape[::-1])
        survs_overall += surv
    survs_overall /= float(n_types)

    # survival image - layers
    surv_layers = []  #survs[0][1]
    for surv_str in survs:
        layers = surv_str[1]
        if len(surv_layers) == 0:
            surv_layers = layers
        else:
            for i, surv_l in enumerate(layers):
                surv_layers[i] += surv_l
    surv_layers = [x / float(n_types) for x in surv_layers]

    n_layers = len(surv_layers)

    # VISUALIZATION ----------------------------------------------------------------------------------
    if show or save_fig:
        # survival image - overall
        fig_surv_overall = plt.figure(figsize=(24, 14))
        plt.subplot(121), plt.imshow(image, 'gray', interpolation='nearest')
        plt.subplot(122), plt.imshow(survs_overall,
                                     'jet',
                                     interpolation='nearest')
        divider = make_axes_locatable(plt.gca())
        cax = divider.append_axes('right', size='5%', pad=0.05)
        plt.colorbar(cax=cax)

        # survival image - layers, number = 1, [layer1, layer2, ...]
        fig_surv_layers = plt.figure(figsize=(24, 14))
        for layer_id, survs_l in enumerate(surv_layers):
            plt.subplot(1, n_layers, layer_id + 1)
            plt.imshow(survs_l, 'jet', interpolation='nearest')
            plt.title('layer #%i' % (layer_id + 1))
            divider = make_axes_locatable(plt.gca())
            cax = divider.append_axes('right', size='5%', pad=0.05)
            plt.colorbar(cax=cax)

        # survival image - overall jednotlivych metod [input, dog, log, hog, opencv]
        fig_surv_methods = plt.figure(figsize=(24, 14))
        plt.subplot(1, n_types + 1, 1)
        plt.imshow(image, 'gray', interpolation='nearest')
        plt.title('input')
        for type_id, surv_str in enumerate(survs):
            plt.subplot(1, n_types + 1, type_id + 2)
            plt.imshow(surv_str[0], 'jet', interpolation='nearest')
            plt.title(surv_str[2])
            divider = make_axes_locatable(plt.gca())
            cax = divider.append_axes('right', size='5%', pad=0.05)
            plt.colorbar(cax=cax)

        if save_fig:
            fig_surv_overall.savefig(os.path.join(fig_dir, 'surv_overall.png'),
                                     dpi=100,
                                     bbox_inches='tight',
                                     pad_inches=0)
            fig_surv_layers.savefig(os.path.join(fig_dir, 'surv_layers.png'),
                                    dpi=100,
                                    bbox_inches='tight',
                                    pad_inches=0)
            fig_surv_methods.savefig(os.path.join(fig_dir, 'surv_methods.png'),
                                     dpi=100,
                                     bbox_inches='tight',
                                     pad_inches=0)

    if show and show_now:
        plt.show()

    return survs_overall, survs
Example #15
0
def run(image,
        mask,
        pyr_scale,
        blob_type,
        show=False,
        show_now=True,
        save_fig=False,
        verbose=True):
    set_verbose(verbose)

    fig_dir = '/home/tomas/Dropbox/Work/Dizertace/figures/blobs/%s/' % blob_type
    if save_fig:
        if not os.path.exists(fig_dir):
            os.mkdir(fig_dir)

    image, mask = tools.crop_to_bbox(image, mask)
    image = tools.smoothing(image, sliceId=0)

    blobs_pyr = []
    survs_pyr = []
    titles_pyr = []
    pyr_imgs = []
    pyr_masks = []
    for layer_id, (im_pyr, mask_pyr) in enumerate(
            zip(tools.pyramid(image, scale=pyr_scale, inter=cv2.INTER_NEAREST),
                tools.pyramid(mask, scale=pyr_scale,
                              inter=cv2.INTER_NEAREST))):
        blobs_res, survs_res, titles, params = detect_blobs(im_pyr,
                                                            mask_pyr,
                                                            blob_type,
                                                            layer_id=layer_id,
                                                            show=show,
                                                            show_now=show_now,
                                                            save_fig=save_fig,
                                                            verbose=verbose)
        blobs_pyr.append(blobs_res)
        survs_pyr.append(survs_res)
        titles_pyr.append(titles)
        pyr_imgs.append(im_pyr)
        pyr_masks.append(mask_pyr)

    n_layers = len(pyr_imgs)
    n_params = len(
        survs_pyr[0]) - 1  # -1 because the first surv is overall surv

    # survival layers
    # for layer_id, layer in enumerate(survs_pyr):
    #     fig_surv_layer =
    #     for im in layer[1:]:  # the first surv is overall
    #         surv_layer += im
    #     surv_im_layers.append(surv_layer)

    # survival param -

    # survival overall
    surv_overall = np.zeros(image.shape)
    for survs_l in survs_pyr:
        surv_overall += cv2.resize(survs_l[0], image.shape[::-1])

    # responses
    all_blobs = []
    for layer_id, layer_p in enumerate(blobs_pyr):
        scale = pyr_scale**layer_id
        for blobs in layer_p[0]:
            if len(blobs) > 0:
                for blob in blobs:
                    y, x, r = blob
                    all_blobs.append((scale * y, scale * x, scale * r))

    if show or save_fig:
        # SURVIVAL IMAGES  ----------
        # survival fcn - params per layer, number = n_layers
        for layer_id, survs_l in enumerate(survs_pyr):
            fig_surv_layer = plt.figure(figsize=(24, 14))
            for param_id, (im, tit) in enumerate(
                    zip(survs_l[1:], titles_pyr[layer_id][1:])):
                plt.subplot(1, n_params, param_id + 1)
                plt.imshow(im, 'jet', interpolation='nearest')
                plt.title(tit)
                divider = make_axes_locatable(plt.gca())
                cax = divider.append_axes('right', size='5%', pad=0.05)
                plt.colorbar(cax=cax)
            if save_fig:
                fig_surv_layer.savefig(os.path.join(
                    fig_dir, '%s_surv_layer_%i.png' % (blob_type, layer_id)),
                                       dpi=100,
                                       bbox_inches='tight',
                                       pad_inches=0)
        if not show:
            plt.close('all')
        elif blob_type == BLOB_CV:  # need to spare memory
            plt.show()

        # survival fcn - layers per param, number = n_params
        for param_id in range(n_params):
            fig_surv_layer = plt.figure(figsize=(24, 14))
            for layer_id, survs_l in enumerate(survs_pyr):
                plt.subplot(1, n_layers, layer_id + 1)
                plt.imshow(survs_l[param_id + 1],
                           'jet',
                           interpolation='nearest'
                           )  # +1 because the first surv is the overall surv
                plt.title(titles_pyr[layer_id]
                          [param_id +
                           1])  # +1 because the first surv is the overall surv
                divider = make_axes_locatable(plt.gca())
                cax = divider.append_axes('right', size='5%', pad=0.05)
                plt.colorbar(cax=cax)
            if save_fig:
                fig_surv_layer.savefig(os.path.join(
                    fig_dir, '%s_surv_%s.png' % (blob_type, params[param_id])),
                                       dpi=100,
                                       bbox_inches='tight',
                                       pad_inches=0)
        if not show:
            plt.close('all')
        elif blob_type == BLOB_CV:  # need to spare memory
            plt.show()

        # survival fcn - layers, number = 1, [layer1, layer2, ...]
        fig_surv_layers = plt.figure(figsize=(24, 14))
        for layer_id, survs_l in enumerate(survs_pyr):
            plt.subplot(1, n_layers, layer_id + 1)
            plt.imshow(survs_l[0], 'jet', interpolation='nearest')
            plt.title('layer #%i, surv' % (layer_id + 1))
            divider = make_axes_locatable(plt.gca())
            cax = divider.append_axes('right', size='5%', pad=0.05)
            plt.colorbar(cax=cax)

        # survival fcn - params, number = 1, [param1, param2, ...]
        surv_params = []
        for i in range(n_params):
            surv_params.append(np.zeros(image.shape))
        for layer in survs_pyr:
            for i, surv in enumerate(
                    layer[1:]):  # from 1 because the first surv is overall
                surv_params[i] += cv2.resize(surv, image.shape[::-1])
        fig_surv_params = plt.figure(figsize=(24, 14))
        for param_id, (surv_p, param) in enumerate(zip(surv_params, params)):
            plt.subplot(1, n_params, param_id + 1)
            plt.imshow(surv_p, 'jet', interpolation='nearest')
            plt.title('%s, surv' % param)
            divider = make_axes_locatable(plt.gca())
            cax = divider.append_axes('right', size='5%', pad=0.05)
            plt.colorbar(cax=cax)

        # survival fcn - overall, number = 1
        fig_surv = plt.figure(figsize=(24, 14))
        plt.subplot(121), plt.imshow(
            image, 'gray', interpolation='nearest'), plt.title('input')
        plt.subplot(122), plt.imshow(surv_overall,
                                     'jet',
                                     interpolation='nearest')
        plt.title('%s - overall survival fcn' % blob_type)
        divider = make_axes_locatable(plt.gca())
        cax = divider.append_axes('right', size='5%', pad=0.05)
        plt.colorbar(cax=cax)

        # RESPONSE IMAGES  ----------
        # response image - layers per param, number = n_params, [p1l1, p1l2, ...]
        for param_id in range(n_params):
            fig_resps_layer = plt.figure(figsize=(24, 14))
            for layer_id, blobs_l in enumerate(blobs_pyr):
                plt.subplot(1, n_layers, layer_id + 1)
                plt.imshow(pyr_imgs[layer_id], 'gray', interpolation='nearest')
                for blobs in blobs_l[param_id + 1]:
                    if len(blobs) > 0:
                        for blob in blobs:
                            y, x, r = blob
                            c = plt.Circle((x, y),
                                           r,
                                           color='r',
                                           linewidth=2,
                                           fill=False)
                            plt.gca().add_patch(c)
                plt.title(titles_pyr[layer_id]
                          [param_id +
                           1])  # +1 because the first surv is the overall surv
            if save_fig:
                fig_resps_layer.savefig(os.path.join(
                    fig_dir,
                    '%s_resps_%s.png' % (blob_type, params[param_id])),
                                        dpi=100,
                                        bbox_inches='tight',
                                        pad_inches=0)
        if not show:
            plt.close('all')
        elif blob_type == BLOB_CV:  # need to spare memory
            plt.show()

        # response image - params per layer, number = n_layers, [l1p1, l1p2, ...]
        for layer_id, blobs_l in enumerate(blobs_pyr):
            fig_resps_layer = plt.figure(figsize=(24, 14))
            for param_id, (param, tit) in enumerate(
                    zip(params, titles_pyr[layer_id][1:])):
                plt.subplot(1, n_params, param_id + 1)
                plt.imshow(pyr_imgs[layer_id], 'gray', interpolation='nearest')
                for blobs in blobs_l[param_id + 1]:
                    if len(blobs) > 0:
                        for blob in blobs:
                            y, x, r = blob
                            c = plt.Circle((x, y),
                                           r,
                                           color='r',
                                           linewidth=2,
                                           fill=False)
                            plt.gca().add_patch(c)
                plt.title(tit)
            if save_fig:
                fig_resps_layer.savefig(os.path.join(
                    fig_dir, '%s_resps_layer_%i.png' % (blob_type, layer_id)),
                                        dpi=100,
                                        bbox_inches='tight',
                                        pad_inches=0)
        if not show:
            plt.close('all')
        elif blob_type == BLOB_CV:  # need to spare memory
            plt.show()

        # response image - params, number = 1, [param1, param2, ...]
        fig_resps_params = plt.figure(figsize=(24, 14))
        for param_id, param in enumerate(params):
            for layer_id, blobs_l in enumerate(blobs_pyr):
                scale = pyr_scale**layer_id
                plt.subplot(1, n_params, param_id + 1)
                plt.imshow(pyr_imgs[0], 'gray', interpolation='nearest')
                for blobs in blobs_l[param_id + 1]:
                    if len(blobs) > 0:
                        for blob in blobs:
                            y, x, r = blob
                            c = plt.Circle((scale * x, scale * y),
                                           scale * r,
                                           color='r',
                                           linewidth=2,
                                           fill=False)
                            plt.gca().add_patch(c)
                plt.title('%s' % param)

        # response image - layers, number = 1
        fig_resps_layers = plt.figure(figsize=(24, 14))
        for layer_id, blobs_l in enumerate(blobs_pyr):
            plt.subplot(1, n_layers, layer_id + 1)
            plt.imshow(pyr_imgs[layer_id], 'gray', interpolation='nearest')
            for blobs in blobs_l[0]:
                if len(blobs) > 0:
                    for blob in blobs:
                        y, x, r = blob
                        c = plt.Circle((x, y),
                                       r,
                                       color='r',
                                       linewidth=2,
                                       fill=False)
                        plt.gca().add_patch(c)
            plt.title('layer #%i' % (layer_id + 1))

        # response image - overall, number = 1
        fig_resp = plt.figure(figsize=(24, 14))
        plt.subplot(121), plt.imshow(
            image, 'gray', interpolation='nearest'), plt.title('input')
        plt.subplot(122), plt.imshow(image, 'gray', interpolation='nearest')
        for blob in all_blobs:
            y, x, r = blob
            c = plt.Circle((x, y), r, color='r', linewidth=2, fill=False)
            plt.gca().add_patch(c)
        plt.title('%s - overall response image' % blob_type)

        if save_fig:
            fig_surv.savefig(os.path.join(fig_dir,
                                          '%s_surv_overall.png' % blob_type),
                             dpi=100,
                             bbox_inches='tight',
                             pad_inches=0)
            fig_surv_layers.savefig(os.path.join(
                fig_dir, '%s_surv_layers.png' % blob_type),
                                    dpi=100,
                                    bbox_inches='tight',
                                    pad_inches=0)
            fig_surv_params.savefig(os.path.join(
                fig_dir, '%s_surv_params.png' % blob_type),
                                    dpi=100,
                                    bbox_inches='tight',
                                    pad_inches=0)
            fig_resp.savefig(os.path.join(fig_dir,
                                          '%s_resps_overall.png' % blob_type),
                             dpi=100,
                             bbox_inches='tight',
                             pad_inches=0)
            fig_resps_layers.savefig(os.path.join(
                fig_dir, '%s_resps_layers.png' % blob_type),
                                     dpi=100,
                                     bbox_inches='tight',
                                     pad_inches=0)
            fig_resps_params.savefig(os.path.join(
                fig_dir, '%s_resps_params.png' % blob_type),
                                     dpi=100,
                                     bbox_inches='tight',
                                     pad_inches=0)

        if show_now:
            plt.show()

    return surv_overall, survs_pyr, pyr_imgs, pyr_masks
Example #16
0
def run(image,
        mask,
        type='dark',
        pyr_scale=2.,
        min_pyr_size=20,
        show=False,
        show_now=True,
        save_fig=False,
        verbose=True):
    set_verbose(verbose)

    fig_dir = '/home/tomas/Dropbox/Work/Dizertace/figures/circloids/'
    image = tools.smoothing(image)
    image_bb, mask_bb = tools.crop_to_bbox(image, mask)

    # mask_shapes = [(5, 5, 0), (9, 5, 0), (9, 5, 45), (9, 5, 90), (9, 5, 135)]
    mask_shapes = [(15, 15, 0), (29, 15, 0), (29, 15, 45), (29, 15, 90),
                   (29, 15, 135)]
    n_masks = len(mask_shapes)
    border_width = 1

    _debug('Creating masks...')
    masks, elipses = create_masks(mask_shapes,
                                  border_width=border_width,
                                  show=False,
                                  show_masks=False)

    # filters_fig = plt.figure(figsize=(24, 14))
    # for m_id, m in enumerate(masks):
    #     mask_lab = np.zeros(m[0].shape, dtype=np.byte)
    #     for i, j in enumerate(m):
    #         mask_lab += (i + 1) * j
    #     plt.subplot(1, n_masks, m_id + 1)
    #     plt.imshow(mask_lab, 'jet', interpolation='nearest')
    # filters_fig.savefig(os.path.join(fig_dir, 'masks.png'), dpi=100, bbox_inches='tight', pad_inches=0)
    # plt.show()

    pyr_imgs = []
    pyr_masks = []
    pyr_positives = []
    pyr_outs = []
    pyr_elip_imgs = []

    if save_fig:
        if not os.path.exists(fig_dir):
            os.mkdir(fig_dir)

    _debug('Calculating responses...')
    for layer_id, (im_pyr, mask_pyr) in enumerate(
            zip(tools.pyramid(image, scale=pyr_scale, inter=cv2.INTER_NEAREST),
                tools.pyramid(mask, scale=pyr_scale,
                              inter=cv2.INTER_NEAREST))):
        im_pyr, mask_pyr = tools.crop_to_bbox(im_pyr, mask_pyr)

        # setting up values outside mask to better suppress responses on the border of the mask
        if type == 'dark':
            im_pyr = np.where(mask_pyr, im_pyr, 0)
        else:
            im_pyr = np.where(mask_pyr, im_pyr, 255)

        pyr_imgs.append(im_pyr)
        pyr_masks.append(mask_pyr)

        hist, bins = skiexp.histogram(im_pyr[np.nonzero(mask_pyr)])
        liver_peak = bins[np.argmax(hist)]

        layer_positives = [
        ]  # list of candidates for current layer and all masks
        layer_outs = []
        layer_elip_imgs = []  # list of pyramid layers with elipse overlays

        for mask_id, (m, e) in enumerate(zip(masks, elipses)):
            mask_positives = []
            win_size = m[0].shape[::-1]
            step_size = 4
            for (x, y, win_mask,
                 win) in tools.sliding_window(im_pyr,
                                              window_size=win_size,
                                              step_size=step_size,
                                              mask=mask_pyr):
                resp, m_resps = masks_response(win,
                                               m,
                                               type=type,
                                               mean_val=liver_peak,
                                               show=False)
                if resp:
                    # positives.append(((x, y), (x + win_size[0], y + win_size[1])))
                    elip = ((e[0][0] + x, e[0][1] + y), e[1], e[2])
                    mask_positives.append(elip)

            layer_positives.append(mask_positives)

            # creating out image and elip image
            mask_outs = np.zeros(im_pyr.shape)
            mask_elip = cv2.cvtColor(im_pyr.copy(), cv2.COLOR_GRAY2BGR)
            for i in mask_positives:
                tmp = np.zeros(im_pyr.shape)
                cv2.ellipse(tmp, i[0], i[1], i[2], 0, 360, 1, thickness=-1)
                cv2.ellipse(mask_elip,
                            i[0],
                            i[1],
                            i[2],
                            0,
                            360, (255, 0, 255),
                            thickness=1)
                mask_outs += tmp
            layer_outs.append(mask_outs)
            layer_elip_imgs.append(mask_elip)

        pyr_positives.append(layer_positives)
        pyr_outs.append(layer_outs)
        pyr_elip_imgs.append(layer_elip_imgs)

    n_layers = len(pyr_imgs)

    # survival image for masks
    surv_im_masks = []
    for i in range(n_masks):
        surv_im_masks.append(np.zeros(image_bb.shape))
    for layer in pyr_outs:
        for i, mask_resp in enumerate(layer):
            surv_im_masks[i] += cv2.resize(mask_resp, image_bb.shape[::-1])

    # survival image for pyramid layers
    surv_im_layers = []
    for i, layer in enumerate(pyr_outs):
        surv_layer = np.zeros(layer[0].shape)
        for mask_resp in layer:
            surv_layer += mask_resp
        surv_im_layers.append(surv_layer)

    # survival image - overall
    all_outs = [im for layer in pyr_outs for im in layer]
    surv_im_pyr = np.zeros(image_bb.shape)
    for im_out in all_outs:
        surv_im_pyr += cv2.resize(im_out, image_bb.shape[::-1])

    # responses - overall
    resp_im_pyr = cv2.cvtColor(image_bb, cv2.COLOR_GRAY2RGB)
    for layer_id, layer_p in enumerate(pyr_positives):
        scale = pyr_scale**layer_id
        for mask_r in layer_p:
            for r in mask_r:
                cv2.ellipse(resp_im_pyr,
                            tuple([int(scale * x) for x in r[0]]),
                            tuple([int(scale * x) for x in r[1]]),
                            r[2],
                            0,
                            360, (255, 0, 255),
                            thickness=1)

    # responses - layers
    resp_im_layers = []
    for layer_id, layer_p in enumerate(pyr_positives):
        resp_layer = cv2.cvtColor(pyr_imgs[layer_id], cv2.COLOR_GRAY2RGB)
        for mask_r in layer_p:
            for r in mask_r:
                # cv2.ellipse(resp_layer, tuple([int(scale * x) for x in r[0]]), tuple([int(scale * x) for x in r[1]]), r[2], 0, 360, (255, 0, 255), thickness=1)
                cv2.ellipse(resp_layer,
                            r[0],
                            r[1],
                            r[2],
                            0,
                            360, (255, 0, 255),
                            thickness=1)
        resp_im_layers.append(resp_layer)

    # responses - masks
    resp_im_masks = []
    for i in range(n_masks):
        resp_im_masks.append(cv2.cvtColor(image_bb, cv2.COLOR_GRAY2RGB))
    for layer_id, layer_p in enumerate(pyr_positives):
        scale = pyr_scale**layer_id
        for mask_id, mask_r in enumerate(layer_p):
            for r in mask_r:
                cv2.ellipse(resp_im_masks[mask_id],
                            tuple([int(scale * x) for x in r[0]]),
                            tuple([int(scale * x) for x in r[1]]),
                            r[2],
                            0,
                            360, (255, 0, 255),
                            thickness=1)

    # SHOWING AND SAVING RESULTS -----------------------------------------------------------------
    if show:
        # masks
        filters_fig = plt.figure(figsize=(24, 14))
        for m_id, m in enumerate(masks):
            mask_lab = np.zeros(m[0].shape, dtype=np.byte)
            for i, j in enumerate(m):
                mask_lab += (i + 1) * j
            plt.subplot(1, n_masks, m_id + 1)
            plt.imshow(mask_lab, 'jet', interpolation='nearest')
        if save_fig:
            filters_fig.savefig(os.path.join(fig_dir, 'masks.png'),
                                dpi=100,
                                bbox_inches='tight',
                                pad_inches=0)

        # responses - figure shows masks resps in a pyramid layer
        for layer_id, layer in enumerate(pyr_elip_imgs):
            layer_fig = plt.figure(figsize=(24, 14))
            # plt.suptitle('layer #%i' % (layer_id + 1))

            for mask_id, mask_outs in enumerate(layer):
                plt.subplot(1, len(mask_shapes), mask_id + 1)
                plt.imshow(mask_outs, interpolation='nearest')
                plt.title('layer #%i, mask #%i' % (layer_id + 1, mask_id + 1))
            if save_fig:
                layer_fig.savefig(os.path.join(
                    fig_dir, 'resps_layer_%i.png' % (layer_id + 1)),
                                  dpi=100,
                                  bbox_inches='tight',
                                  pad_inches=0)

        # responses - overall
        resp_fig = plt.figure(figsize=(24, 14))
        plt.subplot(121), plt.imshow(pyr_imgs[0],
                                     'gray',
                                     interpolation='nearest')
        plt.title('input')
        plt.subplot(122), plt.imshow(resp_im_pyr, interpolation='nearest')
        plt.title('overall responses')
        if save_fig:
            resp_fig.savefig(os.path.join(fig_dir, 'resps_overall.png'),
                             dpi=100,
                             bbox_inches='tight',
                             pad_inches=0)

        # responses - layers
        resp_layer_fig = plt.figure(figsize=(24, 14))
        for i, resp_l in enumerate(resp_im_layers):
            plt.subplot(1, n_layers, i + 1)
            plt.imshow(resp_l, interpolation='nearest')
            plt.title('resps for layer #%i' % (i + 1))
        if save_fig:
            resp_layer_fig.savefig(os.path.join(fig_dir, 'resps_layers.png'),
                                   dpi=100,
                                   bbox_inches='tight',
                                   pad_inches=0)

        # responses - masks
        resp_mask_fig = plt.figure(figsize=(24, 14))
        for i, resp_m in enumerate(resp_im_masks):
            plt.subplot(1, n_masks, i + 1)
            plt.imshow(resp_m, interpolation='nearest')
            plt.title('resps for mask #%i' % (i + 1))
        if save_fig:
            resp_mask_fig.savefig(os.path.join(fig_dir, 'resps_masks.png'),
                                  dpi=100,
                                  bbox_inches='tight',
                                  pad_inches=0)

        # survival image - layers
        surv_layer_fig = plt.figure(figsize=(24, 14))
        for i, surv_l in enumerate(surv_im_layers):
            plt.subplot(1, len(surv_im_layers), i + 1)
            plt.imshow(surv_l, interpolation='nearest')
            plt.title('surv im for layer #%i' % (i + 1))
            divider = make_axes_locatable(plt.gca())
            cax = divider.append_axes('right', size='5%', pad=0.05)
            plt.colorbar(cax=cax)
        if save_fig:
            surv_layer_fig.savefig(os.path.join(fig_dir, 'surv_im_layers.png'),
                                   dpi=100,
                                   bbox_inches='tight',
                                   pad_inches=0)

        # survival image - masks
        surv_mask_fig = plt.figure(figsize=(24, 14))
        for i, surv_m in enumerate(surv_im_masks):
            plt.subplot(1, len(surv_im_masks), i + 1)
            plt.imshow(surv_m, interpolation='nearest')
            plt.title('surv im for mask #%i' % (i + 1))
            divider = make_axes_locatable(plt.gca())
            cax = divider.append_axes('right', size='5%', pad=0.05)
            plt.colorbar(cax=cax)
        if save_fig:
            surv_mask_fig.savefig(os.path.join(fig_dir, 'surv_im_masks.png'),
                                  dpi=100,
                                  bbox_inches='tight',
                                  pad_inches=0)

        # survival image - overall
        surv_fig = plt.figure(figsize=(24, 14))
        plt.subplot(121), plt.imshow(pyr_imgs[0],
                                     'gray',
                                     interpolation='nearest')
        plt.title('input')
        plt.subplot(122), plt.imshow(surv_im_pyr, interpolation='nearest')
        plt.title('overall survival fcn')
        divider = make_axes_locatable(plt.gca())
        cax = divider.append_axes('right', size='5%', pad=0.05)
        plt.colorbar(cax=cax)
        if save_fig:
            surv_fig.savefig(os.path.join(fig_dir, 'surv_im_overall.png'),
                             dpi=100,
                             bbox_inches='tight',
                             pad_inches=0)

    if show_now:
        plt.show()

    return surv_im_pyr, surv_im_layers, surv_im_masks
Example #17
0
def run(image,
        mask=None,
        n_points=24,
        radius=3,
        lbp_type='flat',
        blob_type='hypo',
        pyr_scale=2,
        show=False,
        show_now=True,
        save_fig=False,
        verbose=True):
    set_verbose(verbose)

    if mask is None:
        mask = np.ones_like(image)

    image, mask = tools.crop_to_bbox(image, mask)
    image = tools.smoothing(image, sliceId=0)

    lbp_pyr = []
    pyr_imgs = []
    pyr_masks = []
    for layer_id, (im_pyr, mask_pyr) in enumerate(
            zip(tools.pyramid(image, scale=pyr_scale, inter=cv2.INTER_NEAREST),
                tools.pyramid(mask, scale=pyr_scale,
                              inter=cv2.INTER_NEAREST))):
        lbp_res = local_binary_pattern(im_pyr, n_points, radius, 'uniform')
        w = radius - 1
        lbp_prototype = find_prototypes(im_pyr,
                                        mask_pyr,
                                        lbp_res,
                                        lbp_type,
                                        blob_type,
                                        w,
                                        n_points,
                                        k=1)
        lbp_pyr.append(lbp_prototype.astype(np.float))
        pyr_imgs.append(im_pyr)
        pyr_masks.append(mask_pyr)

    # survival overall
    surv_overall = np.zeros(image.shape)
    for surv_l in lbp_pyr:
        surv_overall += cv2.resize(surv_l, image.shape[::-1])

    # visualization
    if show:
        n_layers = len(lbp_pyr)
        imgs = [image, surv_overall] + lbp_pyr
        n_non_layers = len(imgs) - len(lbp_pyr)
        titles = ['input', 'surv'
                  ] + ['layer #%i' % (i + 1) for i in range(n_layers)]
        to_rgb = [
            0,
            0,
        ] + n_layers * [
            1,
        ]
        cmaps = ['gray', 'jet'] + n_layers * ['jet']
        plt.figure()
        for i, (im, tit, cmap,
                conv) in enumerate(zip(imgs, titles, cmaps, to_rgb)):
            plt.subplot(1, n_layers + n_non_layers, i + 1)
            if conv:
                plt.imshow(label2rgb(im,
                                     image=pyr_imgs[i - n_non_layers],
                                     bg_label=0,
                                     alpha=0.5),
                           interpolation='nearest')
            else:
                plt.imshow(im, cmap, interpolation='nearest')
                # if i == 1:
                #     plt.colorbar(ticks=np.unique(im.astype(np.int)))
            plt.title(tit)
        # plt.subplot(132), plt.imshow(label2rgb(hypo_m, image=im_bb, bg_label=0, alpha=0.5)), plt.title('input < input.mean()')
        # plt.subplot(133), plt.imshow(label2rgb(hypo_lbp, image=im_bb, bg_label=0, alpha=0.5)), plt.title('hypo lbp')

        # plt.figure()
        # counts, _, bars = plt.hist(lbp.ravel(), normed=True, bins=lbp.max() + 1, range=(0, lbp.max() + 1), facecolor='0.5')
        # for i in flat_labels:
        #     bars[i].set_facecolor('r')
        # plt.gca().set_ylim(ymax=np.max(counts[:-1]))
        # plt.gca().set_xlim(xmax=n_points + 2)
        # plt.title('lbp hist with highlighted flat prototypes')
        if show_now:
            plt.show()

    return surv_overall, lbp_pyr
Example #18
0
def run_param_tuning_morphsnakes(im_in,
                                 gt_mask,
                                 slice_ind,
                                 smoothing=True,
                                 scale=0.5,
                                 init_scale=0.5):
    if smoothing:
        im_in = tools.smoothing(im_in, sigmaSpace=10, sigmaColor=10, sliceId=0)

    im = im_in.copy()
    mask_init = tools.initialize_graycom(im,
                                         slice,
                                         distances=[
                                             1,
                                         ],
                                         scale=init_scale)

    # parameters tuning ---------------------------------------------------------------
    alpha_v = (10, 100, 500)
    sigma_v = (1, 5)
    threshold_v = (0.1, 0.5, 0.9)
    balloon_v = (1, 2, 4)

    method = 'morphsnakes'
    # create workbook for saving the resulting pracision, recall and f-measure
    workbook = xlsxwriter.Workbook(
        '/home/tomas/Dropbox/Data/liver_segmentation/%s/%s.xlsx' %
        (method, method))
    worksheet = workbook.add_worksheet()
    # Add a bold format to use to highlight cells.
    bold = workbook.add_format({'bold': True})
    # green = workbook.add_format({'bg_color': '#C6EFCE'})
    worksheet.write(0, 0, 'F-MEASURE', bold)
    worksheet.write(0, 1, 'PRECISION', bold)
    worksheet.write(0, 2, 'RECALL', bold)
    worksheet.write(0, 4, 'alpha', bold)
    worksheet.write(0, 5, 'sigma', bold)
    worksheet.write(0, 6, 'threshold', bold)
    worksheet.write(0, 7, 'ballon', bold)
    worksheet.write(0, 8, 'scale', bold)
    worksheet.write(0, 9, 'scale_init', bold)

    params_tune = []
    for p in itertools.product(alpha_v, sigma_v, threshold_v, balloon_v):
        params_tune.append(p)
    # for i, (alpha, sigma, threshold, balloon) in enumerate(itertools.product(alpha_v, sigma_v, threshold_v, balloon_v)):
    for i in range(len(params_tune)):
        alpha, sigma, threshold, balloon = params_tune[i]
        # threshold = 0.9
        # balloon = 4
        print '\n  --  it #%i/%i  --' % (i + 1, len(params_tune))
        print 'Working with alpha=%i, sigma=%i, threshold=%.1f, balloon=%i' % (
            alpha, sigma, threshold, balloon)
        params = {
            'alpha': alpha,
            'sigma': sigma,
            'smoothing_ls': 1,
            'threshold': threshold,
            'balloon': balloon,
            'max_iters': 1000,
            'scale': scale,
            'init_scale': init_scale,
            'smoothing': False,
            'save_fig': False,
            'show': True,
            'show_now': False
        }
        im, mask, seg = run(im_in,
                            slice=slice_ind,
                            mask=mask_init,
                            method=method,
                            **params)

        # print 'shapes 1: im={}, mask={}, seg={}'.format(im.shape, mask.shape, seg.shape)
        if im.shape != im_in.shape:
            im = tools.resize_ND(im, shape=im_in.shape)
        if mask.shape != gt_mask.shape:
            mask = tools.resize_ND(mask, shape=gt_mask.shape)
        if seg.shape != gt_mask.shape:
            seg = tools.resize_ND(seg, shape=gt_mask.shape)
        # print 'shapes 2: im={}, mask={}, seg={}'.format(im.shape, mask.shape, seg.shape)

        # calculating precision, recall and f_measure
        precision, recall, f_measure = calc_statistics(seg, gt_mask)
        # print 'shapes 3: im={}, mask={}, seg={}'.format(im.shape, mask.shape, seg.shape)

        # saving data
        datap = {'im': im, 'mask': mask, 'seg': seg, 'params': params}
        dirname = '/home/tomas/Dropbox/Data/liver_segmentation/%s/' % method
        dataname = '%s_al%i_si%i_th%s_ba%i.pklz' % (
            method, alpha, sigma, str(threshold).replace('.', ''), balloon)
        f = gzip.open(os.path.join(dirname, dataname), 'w')
        pickle.dump(datap, f)
        f.close()

        # saving results
        cols = [0, 1, 2, 4, 5, 6, 7, 8, 9]
        items = (f_measure, precision, recall, alpha, sigma, threshold,
                 balloon, params['scale'], params['init_scale'])
        for j, it in enumerate(items):
            worksheet.write(i + 1, cols[j], it)

        # creating visualization
        fig = tools.visualize_seg(im,
                                  seg,
                                  mask,
                                  slice=slice_ind,
                                  title=method,
                                  for_save=True,
                                  show_now=False)
        fname = '/home/tomas/Dropbox/Data/liver_segmentation/%s/%s_al%i_si%i_th%s_ba%i.png' \
                % (method, method, alpha, sigma, str(threshold).replace('.', ''), balloon)
        fig.savefig(fname)
        plt.close('all')

    workbook.close()
Example #19
0
def run(im, mask=None, save_fig=False, smoothing=False, return_all=False, show=False, show_now=True):

    if mask is None:
        mask = np.ones(im.shape[:-1])
        im_orig = im.copy()
    else:
        im, mask = tools.crop_to_bbox(im, mask)
        im_orig = im.copy()
        mean_v = int(im[np.nonzero(mask)].mean())
        im = np.where(mask, im, mean_v)

    if im.ndim == 2:
        im = cv2.cvtColor(im, cv2.COLOR_BAYER_GR2RGB)
        # im = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)

    im_orig = im.copy()
    orig_shape = im_orig.shape[:-1]

    if smoothing:
        im = tools.smoothing(im)

    # img = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY)
    # im *= im < np.median(im)

    # img = cv2.resize(img, (intensty.shape[1], intensty.shape[0]))
    intensty = intensityConspicuity(im)
    # intensty *= img < np.median(img)
    # intensty2 = intensty * (img < np.median(img))
    gabor = gaborConspicuity(im, 4)

    im = makeNormalizedColorChannels(im)
    rg = rgConspicuity(im)
    by = byConspicuity(im)
    c = rg + by
    saliency = 1./3 * (N(intensty) + N(c) + N(gabor))
    saliency_mark_max = markMaxima(saliency)
    cout = .25 * c

    # saliency_nonN = 1./3 * (intensty + c + gabor)
    # saliency_nonN = cv2.resize(saliency_nonN, dsize=orig_shape[::-1]) * mask

    intensty = cv2.resize(intensty, dsize=orig_shape[::-1]) * mask
    gabor = cv2.resize(gabor, dsize=orig_shape[::-1]) * mask
    rg = cv2.resize(rg, dsize=orig_shape[::-1]) * mask
    by = cv2.resize(by, dsize=orig_shape[::-1]) * mask
    cout = cv2.resize(cout, dsize=orig_shape[::-1]) * mask
    saliency = cv2.resize(saliency, dsize=orig_shape[::-1]) * mask
    saliency_mark_max = cv2.resize(saliency_mark_max, dsize=orig_shape[::-1])

    # morphology
    # saliency2 = skimor.closing(saliency, selem=skimor.disk(5))
    # saliency3 = skimor.white_tophat(saliency, selem=skimor.disk(10))
    # plt.figure(figsize=(24, 14))
    # plt.subplot(131), plt.imshow(saliency, 'jet', interpolation='nearest'), plt.title('saliency')
    # plt.subplot(132), plt.imshow(saliency2, 'jet', interpolation='nearest'), plt.title('saliency + gray morph close (disk(3))')
    # plt.subplot(133), plt.imshow(saliency3, 'jet', interpolation='nearest'), plt.title('saliency + white top hat (disk(3))')
    # plt.show()

    # plt.figure()
    # plt.subplot(241), plt.imshow(intensty, 'gray', interpolation='nearest'), plt.title('intensity')
    # plt.subplot(245), plt.imshow(N(intensty), 'gray', interpolation='nearest'), plt.title('norm intensity')
    # plt.subplot(242), plt.imshow(gabor, 'gray', interpolation='nearest'), plt.title('gabor')
    # plt.subplot(246), plt.imshow(N(gabor), 'gray', interpolation='nearest'), plt.title('norm gabor')
    # plt.subplot(243), plt.imshow(rg, 'gray', interpolation='nearest'), plt.title('rg')
    # plt.subplot(247), plt.imshow(N(rg), 'gray', interpolation='nearest'), plt.title('norm rg')
    # plt.subplot(244), plt.imshow(by, 'gray', interpolation='nearest'), plt.title('by')
    # plt.subplot(248), plt.imshow(N(by), 'gray', interpolation='nearest'), plt.title('norm by')
    #
    # plt.figure()
    # plt.subplot(121), plt.imshow(saliency, 'gray', interpolation='nearest'), plt.title('saliency N')
    # plt.subplot(122), plt.imshow(saliency_nonN, 'gray', interpolation='nearest'), plt.title('saliency')
    # plt.show()

    saliency = skiexp.rescale_intensity(saliency, out_range=(0, 1))

    if save_fig:
        save_figs(intensty, gabor, rg, by, cout, saliency, saliency_mark_max)

    if show:
        plt.figure()
        plt.subplot(241), plt.imshow(im_orig, 'gray', interpolation='nearest'), plt.title('input')
        plt.subplot(242), plt.imshow(intensty, 'gray', interpolation='nearest'), plt.title('intensity')
        plt.subplot(243), plt.imshow(gabor, 'gray', interpolation='nearest'), plt.title('gabor')
        plt.subplot(244), plt.imshow(rg, 'gray', interpolation='nearest'), plt.title('rg')
        plt.subplot(245), plt.imshow(by, 'gray', interpolation='nearest'), plt.title('by')
        plt.subplot(246), plt.imshow(cout, 'gray', interpolation='nearest'), plt.title('cout')
        plt.subplot(247), plt.imshow(saliency, 'gray', interpolation='nearest'), plt.title('saliency')
        plt.subplot(248), plt.imshow(saliency_mark_max, 'gray', interpolation='nearest'), plt.title('saliency_mark_max')
        if show_now:
            plt.show()

    if return_all:
        return intensty, gabor, rg, by, cout, saliency, saliency_mark_max
    else:
        return im_orig, im, saliency
Example #20
0
def run(data,
        mask,
        voxel_size,
        is_2D=False,
        bboxing=False,
        return_vis=False,
        show=False,
        show_now=True,
        save_fig=False):
    data_w = tools.windowing(data).astype(np.uint8)
    data_s = tools.smoothing(data_w, sliceId=0) * (mask > 0)
    data_rgb = np.zeros((data_s.shape[1], data_s.shape[2], 3, data_s.shape[0]))
    for i, s in enumerate(data_s):
        data_rgb[:, :, :, i] = cv2.cvtColor(s, cv2.COLOR_BAYER_GR2RGB)
    data_rgb = np.swapaxes(data_rgb, 2, 3)

    slics = skiseg.slic(data_rgb,
                        spacing=np.roll(voxel_size, 2),
                        multichannel=True,
                        n_segments=10)
    # slics = skiseg.slic(data_rgb, spacing=np.roll(voxel_size, 2), multichannel=True, n_segments=100,
    #                     slic_zero=True, enforce_connectivity=True)
    slics = np.swapaxes(np.swapaxes(slics, 1, 2), 0, 1) * (mask > 0)

    # tools.show_3d(slics)

    slics_big = np.zeros_like(slics)
    if is_2D:
        areaT = 500
    else:
        areaT = 6000
    for i in np.unique(slics):
        slic = tools.opening3D(slics == i, selem=skimor.disk(3))
        area = slic.sum()
        if area > areaT:
            slics_big = np.where(slic, slics, slics_big)

    # tools.show_3d((data, slics, slics_big))
    if not return_vis:
        return slics_big

    vis = []
    for i, (im, slic, slic_b,
            mask_s) in enumerate(zip(data_w, slics, slics_big, mask)):
        vis_s = []
        if bboxing:
            im, mask_bb = tools.crop_to_bbox(im, mask_s)
            slic, mask_bb = tools.crop_to_bbox(slic, mask_s)
            slic_b, mask_bb = tools.crop_to_bbox(slic_b, mask_s)
        vis_s.append(('input', im))
        vis_s.append(('slic', slic))
        vis_s.append(('thresholded slic', slic_b))
        vis_s.append(
            ('boundaries', skiseg.mark_boundaries(im, slic_b,
                                                  color=(1, 0, 1))))
        vis.append(vis_s)

    # ranges for visualization
    ranges = [(0, 255), (slics.min(), slics.max()),
              (slics_big.min(), slics_big.max()), (0, 255)]

    # colormaps
    cmaps = ['gray', 'gray', 'jet', 'gray']

    if show or save_fig:
        n_imgs = len(vis[0])
        # pbar = progressbar.ProgressBar(maxval=len(vis), widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage()])
        # widgets = ["Seting up figures: ", progressbar.Percentage(), " ", progressbar.Bar(), " ", progressbar.ETA()]
        # pbar = progressbar.ProgressBar(maxval=len(vis), widgets=widgets)
        # pbar.start()
        for slice_id, (v, mask_s) in enumerate(zip(vis, mask)):
            fig = plt.figure(figsize=(24, 14))
            for i, ((tit, im), rg, cm) in enumerate(zip(v, ranges, cmaps)):
                # tit = v[slice_id][i][0]
                # im = v[slice_id][i][1]
                # im_bb, mask_bb = tools.crop_to_bbox(im, mask_s)
                plt.subplot(1, n_imgs, i + 1)
                plt.imshow(im,
                           cmap=cm,
                           vmin=rg[0],
                           vmax=rg[1],
                           interpolation='nearest')
                plt.title(tit)

            if save_fig:
                fig_dir = '/home/tomas/Dropbox/Work/Dizertace/figures/slics/'
                dirs = fig_dir.split(os.sep)
                for i in range(2, len(dirs)):
                    subdir = os.sep.join(dirs[:i])
                    if not os.path.exists(subdir):
                        os.mkdir(subdir)
                if is_2D:
                    dirname = os.path.join(
                        fig_dir, 'slics_vis_2D_slice_%i.png' % (slice_id + 1))
                else:
                    dirname = os.path.join(
                        fig_dir, 'slics_vis_slice_%i.png' % (slice_id + 1))
                fig.savefig(dirname,
                            dpi=100,
                            bbox_inches='tight',
                            pad_inches=0)
                plt.close('all')
            # pbar.update(slice_id)
        # pbar.finish()
        if show_now:
            plt.show()

    return slics_big, vis, ranges, cmaps
Example #21
0
def run(data, mask=None, save_fig=False, smoothing=False, return_all=False, show=False, show_now=True, verbose=True):
    orig_shape = data.shape
    data = skitra.rescale(data, 0.5, preserve_range=True).astype(np.uint8)

    if data.ndim == 2:
        data = np.expand_dims(data, 0)
        if mask is not None:
            mask = np.expand_dims(mask, 0)
    # data = tools.smoothing_tv(data, weight=0.05, sliceId=0)
    # data = tools.smoothing_gauss(data, sigma=1, sliceId=0)
    if smoothing:
        data = tools.smoothing(data, sigmaSpace=10, sigmaColor=10, sliceId=0)

    # cc.hist2gmm(data, debug=verbose)
    # cc.gmm_segmentation(data, debug=verbose)
    # liver_rv = cc.estim_liver_prob_mod(data, show=False, show_now=show_now)
    _, liver_rv = tools.dominant_class(data, dens_min=10, dens_max=245, show=False, show_now=False)

    liver_prob = liver_rv.pdf(data)
    # app = QtGui.QApplication(sys.argv)
    # viewer = Viewer_3D(data)
    # viewer.show()
    # viewer2 = Viewer_3D(liver_prob, range=True)
    # viewer2.show()
    # sys.exit(app.exec_())

    # plt.figure()
    # plt.imshow(liver_prob[0,...], 'gray', interpolation='nearest')
    # plt.show()

    prob_c = 0.2
    prob_c_2 = 0.01
    seeds1 = liver_prob > (liver_prob.max() * prob_c)
    seeds2 = liver_prob <= (np.median(liver_prob) * prob_c_2)
    seeds = seeds1 + 2 * seeds2

    # plt.figure()
    # liver_prob = liver_prob[0,...]
    # plt.subplot(231), plt.imshow(liver_prob <= liver_prob.mean(), 'gray', interpolation='nearest'), plt.title('mean')
    # plt.subplot(232), plt.imshow(liver_prob <= liver_prob.min(), 'gray', interpolation='nearest'), plt.title('min')
    # plt.subplot(233), plt.imshow(liver_prob <= np.median(liver_prob), 'gray', interpolation='nearest'), plt.title('median')
    # plt.subplot(234), plt.imshow(liver_prob <= 0.5 * np.median(liver_prob), 'gray', interpolation='nearest'), plt.title('0.5 median')
    # plt.subplot(235), plt.imshow(liver_prob <= 0, 'gray', interpolation='nearest'), plt.title('0.1 median')
    # plt.show()

    # plt.figure()
    # plt.subplot(121), plt.imshow(liver_prob[0,...], 'gray', interpolation='nearest')
    # plt.subplot(122), plt.imshow(seeds[0,...], 'gray', interpolation='nearest')
    # plt.show()

    gc = GrowCut(data, seeds, smooth_cell=False, enemies_T=0.7)
    gc.run()

    labs = gc.get_labeled_im().astype(np.uint8)
    # labs2 = skifil.median(labs[0,...], selem=np.ones((3, 3)))
    labs_f = scindifil.median_filter(labs, size=3)

    # plt.figure()
    # plt.subplot(121), plt.imshow(labs[0,...], 'jet', interpolation='nearest')
    # plt.subplot(122), plt.imshow(labs_f[0,...], 'jet', interpolation='nearest')
    # plt.show()

    labs = labs_f

    plt.figure()
    plt.subplot(131), plt.imshow(data[0,...], 'gray', interpolation='nearest')
    plt.subplot(132), plt.imshow(seeds[0,...], 'jet', interpolation='nearest')
    divider = make_axes_locatable(plt.gca())
    cax = divider.append_axes('right', size='5%', pad=0.05)
    plt.colorbar(cax=cax, ticks=np.unique(seeds))
    plt.subplot(133), plt.imshow(labs[0,...], 'jet', interpolation='nearest', vmin=0)
    divider = make_axes_locatable(plt.gca())
    cax = divider.append_axes('right', size='5%', pad=0.05)
    plt.colorbar(cax=cax, ticks=np.unique(seeds))
    plt.show()
Example #22
0
def segmentation_stats(data_struc, scale=1, smoothing=True):
    # fnames = load_data(datadir)
    # fnames = ['/home/tomas/Dropbox/Data/medical/dataset/180_arterial-.pklz',]

    # creating workbook
    workbook = xlsxwriter.Workbook('/home/tomas/Dropbox/Data/liver_segmentation/final_alg/liver_seg_stats.xlsx')
    worksheet = workbook.add_worksheet()
    # Add a bold format to use to highlight cells.
    bold = workbook.add_format({'bold': True})
    # green = workbook.add_format({'bg_color': '#C6EFCE'})
    col_gc_fmea = 3
    col_gc_prec = 6
    col_gc_rec = 9
    col_ls_fmea = 4
    col_ls_prec = 7
    col_ls_rec = 10
    cols_gc = (3, 6, 9)
    cols_ls = (4, 7, 10)
    start_row = 2
    worksheet.write(0, 0, 'DATA', bold)
    worksheet.write(0, 1, 'slice', bold)
    worksheet.write(0, 3, 'F-MEASURE', bold)
    worksheet.write(0, 6, 'PRECISION', bold)
    worksheet.write(0, 9, 'RECALL', bold)

    worksheet.write(1, col_gc_fmea, 'Grow Cut', bold)
    worksheet.write(1, col_ls_fmea, 'Level Sets', bold)
    worksheet.write(1, col_gc_prec, 'Grow Cut', bold)
    worksheet.write(1, col_ls_prec, 'Level Sets', bold)
    worksheet.write(1, col_gc_rec, 'Grow Cut', bold)
    worksheet.write(1, col_ls_rec, 'Level Sets', bold)

    # loading data
    data_fnames = []
    data_slices = []
    for name, num in data_struc:
        for i in num:
            data_fnames.append(name)
            data_slices.append(i)
    n_imgs = len(data_fnames)
    for i, (data_fname, slice) in enumerate(zip(data_fnames, data_slices)):
        fname = data_fname.split('/')[-1].split('.')[0]
        print '#%i/%i, %s [%i]: ' % (i + 1, n_imgs, fname, slice),
        data, gt_mask, voxel_size = tools.load_pickle_data(data_fname)

        data = data[slice,...]
        gt_mask = gt_mask[slice,...]
        print 'windowing ...',
        data = tools.windowing(data)
        shape_orig = data.shape
        data_o = data.copy()

        # plt.figure()
        # plt.imshow(data, 'gray', vmin=0, vmax=255, interpolation='nearest')
        # plt.show()

        if scale != 1:
            print 'resizing ...',
            data = tools.resize_ND(data, scale=scale).astype(np.uint8)

        if smoothing:
            print 'smoothing ...',
            data = tools.smoothing(data)

        print 'gc ...',
        blob, seg_gc = coarse_segmentation(data, clear_border=False, show=False, verbose=False)
        print 'ls ...',
        seg_ls = segmentation_refinement(data, blob, show=False, verbose=False)

        if seg_gc.shape != gt_mask.shape:
            seg_gc = tools.resize_ND(seg_gc, shape=shape_orig)
        if seg_ls.shape != gt_mask.shape:
            seg_ls = tools.resize_ND(seg_ls, shape=shape_orig)

        # computing statistics
        print 'stats ...',
        precision_gc, recall_gc, f_measure_gc = ac.calc_statistics(blob, gt_mask)
        precision_ls, recall_ls, f_measure_ls = ac.calc_statistics(seg_ls, gt_mask)

        # writing statistics
        print 'writing ...',
        items = (f_measure_gc, precision_gc, recall_gc, f_measure_ls, precision_ls, recall_ls)
        worksheet.write(start_row + i, 0, fname)
        worksheet.write(start_row + i, 1, slice)
        for it, col in zip(items, cols_gc + cols_ls):
            worksheet.write(start_row + i, col, it)
        print 'done'

        fig = tools.visualize_seg(data_o, seg_ls, mask=seg_gc, title=fname, show_now=False, for_save=True)
        out_fname = '/home/tomas/Dropbox/Data/liver_segmentation/final_alg/%s_sl_%i.png' % (fname, slice)
        fig.savefig(out_fname)
        plt.close('all')

        print '\t\tfmea = %.3f -> %.3f, prec = %.3f -> %.3f, rec = %.3f -> %.3f' %\
              (f_measure_gc, f_measure_ls, precision_gc, precision_ls, recall_gc, recall_ls)