def save_png(arr, save_path, figsize=(5, 5), **kwargs): f = plt.figure(figsize=figsize) ax = f.add_subplot(111) ax.imshow(arr, **kwargs) pt.save_figure_without_borders(f=f, savePath=save_path)
i = 0 for retain_cell in retain_cells: cells[retain_cell].plot_binary_mask_border(plotAxis=ax, color=colors[i], borderWidth=1) cells[retain_cell].plot_binary_mask_border(plotAxis=ax2, color=colors[i], borderWidth=1) i += 1 plt.show() # save figures pt.save_figure_without_borders(f, os.path.join( save_folder, '2P_refined_ROIs_with_background.png'), dpi=300) pt.save_figure_without_borders(f2, os.path.join( save_folder, '2P_refined_ROIs_without_background.png'), dpi=300) # save h5 file save_file = h5py.File(save_file_name, 'w') i = 0 for retain_cell in retain_cells: print(retain_cell, ':', cells[retain_cell].get_binary_area()) currGroup = save_file.create_group('cell' + ft.int2str(i, 4))
def run(): curr_folder = os.path.dirname(os.path.realpath(__file__)) os.chdir(curr_folder) print('getting total mask ...') cell_f = h5py.File('cells_refined.hdf5', 'r') h, w = cell_f['cell0000']['roi'].attrs['dimension'] total_mask = np.zeros((h, w), dtype=np.uint8) for cell_n, cell_grp in cell_f.items(): curr_roi = ia.WeightedROI.from_h5_group(cell_grp['roi']) curr_mask = curr_roi.get_binary_mask() total_mask = np.logical_or(total_mask, curr_mask) cell_f.close() total_mask = ni.binary_dilation(total_mask, iterations=1) # plt.imshow(total_mask) # plt.title('total_mask') # plt.show() nwb_folder = os.path.dirname(curr_folder) nwb_fn = [f for f in os.listdir(nwb_folder) if f[-4:] == '.nwb'][0] nwb_path = os.path.join(nwb_folder, nwb_fn) plane_n = os.path.split(curr_folder)[1] dset_path = 'processing/motion_correction/MotionCorrection/{}/corrected/data'.format( plane_n) print('downsampling movie ...') print('\tnwb_path: {}'.format(nwb_path)) print('\tdset_path: {}'.format(dset_path)) nwb_f = h5py.File(nwb_path, 'r') dset = nwb_f[dset_path] print('\ttotal shape: {}'.format(dset.shape)) nwb_f.close() mov_d = downsample_mov(nwb_path=nwb_path, dset_path=dset_path, dr=downsample_r) v_min = np.amin(mov_d) v_max = np.amax(mov_d) print('\tshape of downsampled movie: {}'.format(mov_d.shape)) print('\n\tgenerating avi ...') if cv2.__version__[0:3] == '3.1' or cv2.__version__[0] == '4': codex = 'XVID' fourcc = cv2.VideoWriter_fourcc(*codex) out = cv2.VideoWriter('marked_mov.avi', fourcc, 30, (frame_size * 100, frame_size * 100), isColor=True) elif cv2.__version__[0:6] == '2.4.11': out = cv2.VideoWriter('marked_mov.avi', -1, 30, (frame_size * 100, frame_size * 100), isColor=True) elif cv2.__version__[0:3] == '2.4': codex = 'XVID' fourcc = cv2.cv.CV_FOURCC(*codex) out = cv2.VideoWriter('marked_mov.avi', fourcc, 30, (frame_size * 100, frame_size * 100), isColor=True) else: raise EnvironmentError( 'Do not understand opencv cv2 version: {}.'.format( cv2.__version__)) f = plt.figure(figsize=(frame_size, frame_size)) for frame_i, frame in enumerate(mov_d): print('\tframe: {} / {}'.format(frame_i, mov_d.shape[0])) f.clear() ax = f.add_subplot(111) ax.imshow(frame, vmin=v_min, vmax=v_max * 0.5, cmap='gray', interpolation='nearest') pt.plot_mask_borders(total_mask, plotAxis=ax, color='#ff0000', zoom=1, borderWidth=1) ax.set_aspect('equal') # plt.show() buffer_ = io.BytesIO() pt.save_figure_without_borders(f, buffer_, dpi=100) buffer_.seek(0) image = PIL.Image.open(buffer_) curr_frame = np.asarray(image) r, g, b, a = np.rollaxis(curr_frame, axis=-1) curr_frame = (np.dstack((b, g, r))) # print(r.dtype) # print(curr_frame.shape) out.write(curr_frame) out.release() cv2.destroyAllWindows() print('\t.avi movie generated.')
def run(): # pixels, masks with center location within this pixel region at the image border will be discarded center_margin = [ 10, 30, 35, 10 ] # [top margin, bottom margin, left margin, right margin] # area range, range of number of pixels of a valid roi area_range = [5, 500] # [10, 100] for bouton, [150, 1000] for soma # for the two masks that are overlapping, if the ratio between overlap and the area of the smaller mask is larger than # this value, the smaller mask will be discarded. overlap_thr = 0 # 0.2 save_folder = 'figures' data_file_name = 'cells.hdf5' save_file_name = 'cells_refined.hdf5' background_file_name = "corrected_mean_projections.tif" curr_folder = os.path.dirname(os.path.realpath(__file__)) os.chdir(curr_folder) if not os.path.isdir(save_folder): os.makedirs(save_folder) # read cells dfile = h5py.File(data_file_name, 'r') cells = {} for cellname in dfile.keys(): cells.update({cellname: ia.WeightedROI.from_h5_group(dfile[cellname])}) print('total number of cells:', len(cells)) # get the names of cells which are on the edge edge_cells = [] for cellname, cellmask in cells.items(): dimension = cellmask.dimension center = cellmask.get_center() if center[0] < center_margin[0] or \ center[0] > dimension[0] - center_margin[1] or \ center[1] < center_margin[2] or \ center[1] > dimension[1] - center_margin[3]: # cellmask.plot_binary_mask_border(color='#ff0000', borderWidth=1) # plt.title(cellname) # plt.show() edge_cells.append(cellname) print('\ncells to be removed because they are on the edges:') print('\n'.join(edge_cells)) # remove edge cells for edge_cell in edge_cells: _ = cells.pop(edge_cell) # get dictionary of cell areas cell_areas = {} for cellname, cellmask in cells.items(): cell_areas.update({cellname: cellmask.get_binary_area()}) # remove cellnames that have area outside of the area_range invalid_cell_ns = [] for cellname, cellarea in cell_areas.items(): if cellarea < area_range[0] or cellarea > area_range[1]: invalid_cell_ns.append(cellname) print("cells to be removed because they do not meet area criterion:") print("\n".join(invalid_cell_ns)) for invalid_cell_n in invalid_cell_ns: cell_areas.pop(invalid_cell_n) # sort cells with their binary area cell_areas_sorted = sorted(cell_areas.items(), key=operator.itemgetter(1)) cell_areas_sorted.reverse() cell_names_sorted = [c[0] for c in cell_areas_sorted] # print '\n'.join([str(c) for c in cell_areas_sorted]) # get the name of cells that needs to be removed because of overlapping retain_cells = [] remove_cells = [] for cell1_name in cell_names_sorted: cell1_mask = cells[cell1_name] is_remove = 0 cell1_area = cell1_mask.get_binary_area() for cell2_name in retain_cells: cell2_mask = cells[cell2_name] cell2_area = cell2_mask.get_binary_area() curr_overlap = cell1_mask.binary_overlap(cell2_mask) if float(curr_overlap) / cell1_area > overlap_thr: remove_cells.append(cell1_name) is_remove = 1 print(cell1_name, ':', cell1_mask.get_binary_area(), ': removed') # f = plt.figure(figsize=(10,10)) # ax = f.add_subplot(111) # cell1_mask.plot_binary_mask_border(plotAxis=ax, color='#ff0000', borderWidth=1) # cell2_mask.plot_binary_mask_border(plotAxis=ax, color='#0000ff', borderWidth=1) # ax.set_title('red:'+cell1_name+'; blue:'+cell2_name) # plt.show() break if is_remove == 0: retain_cells.append(cell1_name) print(cell1_name, ':', cell1_mask.get_binary_area(), ': retained') print('\ncells to be removed because of overlapping:') print('\n'.join(remove_cells)) print('\ntotal number of reatined cells:', len(retain_cells)) # plotting colors = pt.random_color(len(cells.keys())) bgImg = ia.array_nor(np.max(tf.imread(background_file_name), axis=0)) f = plt.figure(figsize=(10, 10)) ax = f.add_subplot(111) ax.imshow(ia.array_nor(bgImg), cmap='gray', vmin=0, vmax=0.5, interpolation='nearest') f2 = plt.figure(figsize=(10, 10)) ax2 = f2.add_subplot(111) ax2.imshow(np.zeros(bgImg.shape, dtype=np.uint8), vmin=0, vmax=1, cmap='gray', interpolation='nearest') i = 0 for retain_cell in retain_cells: cells[retain_cell].plot_binary_mask_border(plotAxis=ax, color=colors[i], borderWidth=1) cells[retain_cell].plot_binary_mask_border(plotAxis=ax2, color=colors[i], borderWidth=1) i += 1 # plt.show() # save figures pt.save_figure_without_borders(f, os.path.join( save_folder, '2P_refined_ROIs_with_background.png'), dpi=300) pt.save_figure_without_borders( f2, os.path.join(save_folder, '2P_refined_ROIs_without_background.png'), dpi=300) # save h5 file save_file = h5py.File(save_file_name, 'x') i = 0 for retain_cell in retain_cells: print(retain_cell, ':', cells[retain_cell].get_binary_area()) currGroup = save_file.create_group('cell' + ft.int2str(i, 4)) currGroup.attrs['name'] = retain_cell roiGroup = currGroup.create_group('roi') cells[retain_cell].to_h5_group(roiGroup) i += 1 for attr, value in dfile.attrs.items(): save_file.attrs[attr] = value save_file.close() dfile.close()
def run(): data_file_name = 'cells_refined.hdf5' background_file_name = "corrected_mean_projections.tif" save_folder = 'figures' overlap_threshold = 0.9 surround_limit = [1, 8] curr_folder = os.path.dirname(os.path.realpath(__file__)) os.chdir(curr_folder) if not os.path.isdir(save_folder): os.makedirs(save_folder) print('reading cells file ...') data_f = h5py.File(data_file_name, 'r') cell_ns = data_f.keys() cell_ns.sort() binary_mask_array = [] weight_mask_array = [] for cell_n in cell_ns: curr_roi = ia.ROI.from_h5_group(data_f[cell_n]['roi']) binary_mask_array.append(curr_roi.get_binary_mask()) weight_mask_array.append(curr_roi.get_weighted_mask()) data_f.close() binary_mask_array = np.array(binary_mask_array) weight_mask_array = np.array(weight_mask_array) print('starting mask_array shape:', weight_mask_array.shape) print('getting total mask ...') total_mask = np.zeros((binary_mask_array.shape[1], binary_mask_array.shape[2]), dtype=np.uint8) for curr_mask in binary_mask_array: total_mask = np.logical_or(total_mask, curr_mask) total_mask = np.logical_not(total_mask) plt.imshow(total_mask, interpolation='nearest') plt.title('total_mask') # plt.show() print('getting and surround masks ...') binary_surround_array = [] for binary_center in binary_mask_array: curr_surround = np.logical_xor(ni.binary_dilation(binary_center, iterations=surround_limit[1]), ni.binary_dilation(binary_center, iterations=surround_limit[0])) curr_surround = np.logical_and(curr_surround, total_mask).astype(np.uint8) binary_surround_array.append(curr_surround) # plt.imshow(curr_surround) # plt.show() binary_surround_array = np.array(binary_surround_array) print("saving rois ...") center_areas = [] surround_areas = [] for mask_ind in range(binary_mask_array.shape[0]): center_areas.append(np.sum(binary_mask_array[mask_ind].flat)) surround_areas.append(np.sum(binary_surround_array[mask_ind].flat)) roi_f = h5py.File('rois_and_traces.hdf5') roi_f['masks_center'] = weight_mask_array roi_f['masks_surround'] = binary_surround_array roi_f.close() print('minimum surround area:', min(surround_areas), 'pixels.') f = plt.figure(figsize=(10, 10)) ax_center = f.add_subplot(211) ax_center.hist(center_areas, bins=30) ax_center.set_title('roi center area distribution') ax_surround = f.add_subplot(212) ax_surround.hist(surround_areas, bins=30) ax_surround.set_title('roi surround area distribution') # plt.show() print('plotting ...') colors = pt.random_color(weight_mask_array.shape[0]) bg = ia.array_nor(np.max(tf.imread(background_file_name), axis=0)) f_c_bg = plt.figure(figsize=(10, 10)) ax_c_bg = f_c_bg.add_subplot(111) ax_c_bg.imshow(bg, cmap='gray', vmin=0, vmax=0.5, interpolation='nearest') f_c_nbg = plt.figure(figsize=(10, 10)) ax_c_nbg = f_c_nbg.add_subplot(111) ax_c_nbg.imshow(np.zeros(bg.shape,dtype=np.uint8),vmin=0,vmax=1,cmap='gray',interpolation='nearest') f_s_nbg = plt.figure(figsize=(10, 10)) ax_s_nbg = f_s_nbg.add_subplot(111) ax_s_nbg.imshow(np.zeros(bg.shape,dtype=np.uint8),vmin=0,vmax=1,cmap='gray',interpolation='nearest') i = 0 for mask_ind in range(binary_mask_array.shape[0]): pt.plot_mask_borders(binary_mask_array[mask_ind], plotAxis=ax_c_bg, color=colors[i], borderWidth=1) pt.plot_mask_borders(binary_mask_array[mask_ind], plotAxis=ax_c_nbg, color=colors[i], borderWidth=1) pt.plot_mask_borders(binary_surround_array[mask_ind], plotAxis=ax_s_nbg, color=colors[i], borderWidth=1) i += 1 # plt.show() print('saving figures ...') pt.save_figure_without_borders(f_c_bg, os.path.join(save_folder, '2P_ROIs_with_background.png'), dpi=300) pt.save_figure_without_borders(f_c_nbg, os.path.join(save_folder, '2P_ROIs_without_background.png'), dpi=300) pt.save_figure_without_borders(f_s_nbg, os.path.join(save_folder, '2P_ROI_surrounds_background.png'), dpi=300) f.savefig(os.path.join(save_folder, 'roi_area_distribution.pdf'), dpi=300)