Exemple #1
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
Exemple #2
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)
Exemple #3
0
    # hyper, 1 on the border -------------------
    # arterial 0.6mm - not that bad
    # fname = '/home/tomas/Data/medical/liver_segmentation/org-exp_239_61293268_DE_Art_Abd_0.75_I26f_M_0.5-.pklz'
    # venous 5mm - bad
    # fname = '/home/tomas/Data/medical/liver_segmentation/org-exp_239_61293268_DE_Ven_Abd_0.75_I26f_M_0.5-.pklz'

    # shluk -----------------
    # arterial 5mm
    # fname = '/home/tomas/Data/medical/liver_segmentation/org-exp_180_49509315_arterial_5.0_B30f-.pklz'
    # fname = '/home/tomas/Data/medical/liver_segmentation/org-exp_180_49509315_venous_5.0_B30f-.pklz'

    # targeted

    # arterial 0.6mm - bad
    # fname = '/home/tomas/Data/medical/liver_segmentation/org-exp_238_54280551_Abd_Arterial_0.75_I26f_3-.pklz'
    # venous 0.6mm - bad
    # fname = '/home/tomas/Data/medical/liver_segmentation/org-exp_238_54280551_Abd_Venous_0.75_I26f_3-.pklz'

    debug = True
    verbose = True
    data_fname = '/home/tomas/Data/medical/liver_segmentation/org-exp_183_46324212_venous_5.0_B30f-.pklz'
    data, mask, voxel_size = tools.load_pickle_data(data_fname)

    slice_ind = 17
    data_s = data[slice_ind, :, :]
    data_s = tools.windowing(data_s)
    mask_s = mask[slice_ind, :, :]
    # data_s = tools.windowing(data)
    # mask_s = mask

    run(data_s, mask=mask_s, smoothing=True, save_fig=False, show=True, verbose=verbose)
Exemple #4
0
            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()

#-----------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------
if __name__ == '__main__':
    data_fname = '/home/tomas/Data/medical/liver_segmentation/org-exp_183_46324212_venous_5.0_B30f-.pklz'
    data, mask, voxel_size = tools.load_pickle_data(data_fname)

    slice_ind = 17
    data_s = data[slice_ind, :, :]
    data_s = tools.windowing(data_s)
    mask_s = mask[slice_ind, :, :]

    show = False
    show_now = False
    save_fig = True

    run(data_s, mask_s, alpha=50, show=show, show_now=show_now, save_fig=save_fig)

    # im_o, img, saliency = run(data_s, mask_s, show=False)
    # im_o_s, img_s, saliency_s = run(data_s, mask_s, smoothing=True, show=False)
    #
    # plt.figure()
    # plt.subplot(231), plt.imshow(im_o, 'gray', interpolation='nearest'), plt.title('input')
    # plt.subplot(233), plt.imshow(saliency, 'gray', interpolation='nearest'), plt.title('saliency map')
    #
Exemple #5
0
        dist_out = np.absolute(mean_out - int_new)

        return dist_in, dist_out


#---------------------------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------
if __name__ == '__main__':
    data_fname = '/home/tomas/Data/medical/liver_segmentation/org-exp_183_46324212_venous_5.0_B30f-.pklz'
    data, mask, voxel_size = tools.load_pickle_data(data_fname)

    # 2D
    # slice_ind = 17
    slice_ind = 15
    # data = data[slice_ind, :, :]
    data = tools.windowing(data)

    ball_r_out = 1
    ball_r = 5
    min_diff = 1
    alpha = 0.9
    scale = 0.5
    max_iters = 100
    smoothing = True
    show = True
    show_now = False

    _, seeds = tools.initialize_graycom(data, slice=slice_ind, show=show, show_now=show_now)
    # seeds = tools.eroding3D(seeds, np.ones((3, 3))).astype(np.uint8)
    seeds = tools.morph_ND(seeds, 'erosion', selem=np.ones((3, 3)), slicewise=True, sliceId=0).astype(np.uint8)
Exemple #6
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
Exemple #7
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)
Exemple #8
0
def register_dataset():
    dirpath = '/home/tomas/Dropbox/Data/medical/dataset/gt/'
    data_struc = [('180_venous-GT.pklz', '180_arterial-GT.pklz'),
                  ('183a_venous-GT.pklz', '183a_arterial-GT.pklz'),
                  ('185a_venous-GT.pklz', '185a_arterial-GT.pklz'),
                  ('186a_venous-GT.pklz', '186a_arterial-GT.pklz'),
                  ('189a_venous-GT.pklz', '189a_arterial-GT.pklz'),
                  ('221_venous-GT.pklz', '221_arterial-GT.pklz'),
                  ('222a_venous-GT.pklz', '222a_arterial-GT.pklz'),
                  ('232_venous-GT.pklz', '232_arterial-GT.pklz'),
                  # ('234_venous-GT.pklz', '234_arterial-GT.pklz', range(0, 0, s)),
                  ('235_venous-GT.pklz', '235_arterial-GT.pklz')]

    data_struc = [(dirpath + x[0], dirpath + x[1]) for x in data_struc]
    n_data = len(data_struc)

    for i, (fixed_fn, moving_fn) in enumerate(data_struc):
        if i < 5:
            continue
        print 'data #%i/%i: ' % (i + 1, n_data),

        data_v, gt_mask, voxel_size = tools.load_pickle_data(fixed_fn)
        data_v = tools.windowing(data_v)

        data_a, gt_mask, voxel_size = tools.load_pickle_data(moving_fn)
        # data_a = tools.windowing(data_a)
        moving_arr = tools.resize_ND(data_a, shape=data_v.shape).astype(data_a.dtype)
        moving_arr = tools.match_size(moving_arr, data_v.shape, verbose=False)
        data_ao = moving_arr.copy()
        moving_arr = tools.windowing(moving_arr).astype(np.float)
        # moving_arr = tools.windowing(data_a).astype(np.float)

        fixed_arr = data_v.astype(np.float)
        # moving_arr = tools.resize_ND(data_a, shape=data_v.shape).astype(fixed_arr.dtype)
        # moving_arr = tools.match_size(moving_arr, fixed_arr.shape, verbose=False)
        # print fixed_arr.shape, moving_arr.shape

        # plt.figure()
        # plt.subplot(121), plt.imshow(fixed_arr[15,...], 'gray')
        # plt.subplot(122), plt.imshow(moving_arr[15,...], 'gray')
        # plt.show()

        moving_mask = tools.resize_ND(gt_mask, shape=data_v.shape).astype(gt_mask.dtype)
        moving_mask = tools.match_size(moving_mask, data_v.shape)

        n_slices = fixed_arr.shape[0]
        print 'slices: %i - ' % n_slices,

        data_reg = np.zeros_like(moving_arr)
        mask_reg = np.zeros_like(moving_mask)
        for j, (fixed, moving, mask) in enumerate(zip(fixed_arr, moving_arr, moving_mask)):
            if (j % 5) == 0:
                print ' ',
            # print '#',
            print j
            fixed = sitk.GetImageFromArray(fixed)
            moving = sitk.GetImageFromArray(moving)
            # mask = sitk.GetImageFromArray(mask)

            setups = (('simil', 'ms'), ('affine', 'ms'), ('spline', 'mi'))
            for ttype, mtype in setups:
                data_r, tx = register(fixed, moving, mask=mask, transform_type=ttype, metric=mtype, max_iters=300, return_resampler=True, show=False)
                if (data_r == 0).sum() < (0.8 * np.prod(data_r.shape)):
                    print ttype, mtype
                    data_r = transform_data(data_ao[j,...], tx)
                    mask_r = transform_data(mask, tx)
                    break
            data_reg[j, ...] = data_r
            mask_reg[j,...] = mask_r

            # plt.figure()
            # plt.subplot(131), plt.imshow(fixed_arr[j,...], 'gray')
            # plt.subplot(132), plt.imshow(moving_arr[j,...], 'gray')
            # plt.subplot(133), plt.imshow(tools.windowing(data_r), 'gray')
            # plt.show()

        print ' - OK,',
        datap_reg = {'data3d': data_reg, 'segmentation': mask_reg, 'voxelsize_mm': voxel_size, 'slab': {'none': 0, 'liver': 1, 'lesions': 6}}
        outname = dirpath + 'registered/' + moving_fn.split('/')[-1].replace('.pklz', '-registered.pklz')
        # if not os.path.exists(outname):
        #     os.mkdir(outname)
        f = gzip.open(outname, 'wb')
        pickle.dump(datap_reg, f)
        f.close()

        # break

    print 'done'
Exemple #9
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