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
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)
# 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)
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') #
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)
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
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)
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'
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