import tifffile as tf import matplotlib.pyplot as plt import NeuroAnalysisTools.core.ImageAnalysis as ia data_fn = 'zstack_2p_zoom2_red_aligned.tif' save_fn = '2018-08-16-M376019-depth-profile-red.png' start_depth = 50 # micron step_depth = 2 # micron pix_size = 0.7 # sutter scope, zoom2, 512 x 512 resolution = 512 curr_folder = os.path.dirname(os.path.abspath(__file__)) os.chdir(curr_folder) data = tf.imread(data_fn) dp = ia.array_nor(np.mean(data, axis=1)) depth_i = np.array(range(0, dp.shape[0], 50)) depth_l = depth_i * step_depth + start_depth f = plt.figure(figsize=(8, 8)) ax = f.add_subplot(111) ax.imshow(dp, vmin=0, vmax=1, cmap='magma', aspect=step_depth / pix_size) ax.set_xticks([0, resolution-1]) ax.set_xticklabels(['0', '{:7.2f}'.format(resolution*pix_size)]) ax.set_yticks(depth_i) ax.set_yticklabels(depth_l) ax.set_xlabel('horizontal dis (um)') ax.set_ylabel('depth (um)') plt.show()
filter_sigma = 0. # parameters only used if filter the rois # dilation_iterations = 1. # parameters only used if filter the rois cut_thr = 2.5 # low for more rois, high for less rois bg_fn = "corrected_mean_projections.tif" save_folder = 'figures' curr_folder = os.path.dirname(os.path.realpath(__file__)) os.chdir(curr_folder) data_f = h5py.File('caiman_segmentation_results.hdf5') masks = data_f['masks'].value data_f.close() bg = ia.array_nor(np.max(tf.imread(bg_fn), axis=0)) final_roi_dict = {} for i, mask in enumerate(masks): if is_filter: mask_nor = (mask - np.mean(mask.flatten())) / np.abs( np.std(mask.flatten())) mask_nor_f = ni.filters.gaussian_filter(mask_nor, filter_sigma) mask_bin = np.zeros(mask_nor_f.shape, dtype=np.uint8) mask_bin[mask_nor_f > cut_thr] = 1 else: mask_bin = np.zeros(mask.shape, dtype=np.uint8) mask_bin[mask > 0] = 1
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()
# 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',
if 'path_list' in offsets_keys: offsets_keys.remove('path_list') offsets_keys.sort() offsets = [] for offsets_key in offsets_keys: offsets.append(offsets_f[offsets_key].value) offsets = np.concatenate(offsets, axis=0) offsets = np.array(zip(offsets[:, 1], offsets[:, 0])) offsets_f.close() mean_projection = tf.imread( os.path.join(plane_n, 'corrected_mean_projection.tif')) max_projection = tf.imread( os.path.join(plane_n, 'corrected_max_projections.tif')) max_projection = ia.array_nor(np.max(max_projection, axis=0)) input_dict = { 'field_name': plane_n, 'original_timeseries_path': '/acquisition/timeseries/2p_movie_plane' + str(i), 'corrected_file_path': movie_2p_fn, 'corrected_dataset_path': plane_n, 'xy_translation_offsets': offsets, 'mean_projection': mean_projection, 'max_projection':
def run(): isSave = True filter_sigma = 2. # 2. for soma, 1. for bouton thr_high = 0.0 thr_low = 0.1 bg_fn = "corrected_mean_projections.tif" save_folder = 'figures' curr_folder = os.path.dirname(os.path.realpath(__file__)) os.chdir(curr_folder) data_f = h5py.File('caiman_segmentation_results.hdf5', 'r') masks = data_f['masks'].value data_f.close() bg = ia.array_nor(np.max(tf.imread(bg_fn), axis=0)) final_roi_dict = {} roi_ind = 0 for i, mask in enumerate(masks): mask_dict = hl.threshold_mask_by_energy(mask, sigma=filter_sigma, thr_high=thr_high, thr_low=thr_low) for mask_roi in mask_dict.values(): final_roi_dict.update({'roi_{:04d}'.format(roi_ind): mask_roi}) roi_ind += 1 print('Total number of ROIs:', len(final_roi_dict)) f = plt.figure(figsize=(15, 8)) ax1 = f.add_subplot(121) ax1.imshow(bg, vmin=0, vmax=0.5, cmap='gray', interpolation='nearest') colors1 = pt.random_color(masks.shape[0]) for i, mask in enumerate(masks): pt.plot_mask_borders(mask, plotAxis=ax1, color=colors1[i]) ax1.set_title('original ROIs') ax1.set_axis_off() ax2 = f.add_subplot(122) ax2.imshow(ia.array_nor(bg), vmin=0, vmax=0.5, cmap='gray', interpolation='nearest') colors2 = pt.random_color(len(final_roi_dict)) i = 0 for roi in final_roi_dict.values(): pt.plot_mask_borders(roi.get_binary_mask(), plotAxis=ax2, color=colors2[i]) i = i + 1 ax2.set_title('filtered ROIs') ax2.set_axis_off() # plt.show() if isSave: if not os.path.isdir(save_folder): os.makedirs(save_folder) f.savefig(os.path.join(save_folder, 'caiman_segmentation_filtering.pdf'), dpi=300) cell_file = h5py.File('cells.hdf5', 'w') i = 0 for key, value in sorted(final_roi_dict.items()): curr_grp = cell_file.create_group('cell{:04d}'.format(i)) curr_grp.attrs['name'] = key value.to_h5_group(curr_grp) i += 1 cell_file.close()
'vasmap_wf_rotated': 'wide field surface vasculature map through cranial window rotated', 'vasmap_2p_green': '2p surface vasculature map through cranial window green original, zoom1', 'vasmap_2p_green_rotated': '2p surface vasculature map through cranial window green rotated, zoom1', 'vasmap_2p_red': '2p surface vasculature map through cranial window red original, zoom1', 'vasmap_2p_red_rotated': '2p surface vasculature map through cranial window red rotated, zoom1' } curr_folder = os.path.dirname(os.path.realpath(__file__)) os.chdir(curr_folder) nwb_fn = [f for f in os.listdir(curr_folder) if f[-4:] == '.nwb'][0] nwb_f = nt.RecordedFile(nwb_fn) for mn, des in vasmap_dict.items(): try: curr_m = ia.array_nor(tf.imread(mn + '.tif')) if is_plot: f = plt.figure(figsize=(10, 10)) ax = f.add_subplot(111) ax.imshow(curr_m, vmin=0., vmax=1., cmap='gray', interpolation='nearest') ax.set_axis_off() ax.set_title(mn) plt.show() print('adding {} to nwb file.'.format(mn)) nwb_f.add_acquisition_image(mn, curr_m, description=des) except Exception as e: print(e)
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)
import tifffile as tf import matplotlib.pyplot as plt import NeuroAnalysisTools.core.ImageAnalysis as ia data_folder = r"\\allen\programs\braintv\workgroups\nc-ophys\Jun\raw_data\190822-M471944-deepscope\movie" identifier = '110_LSNDGCUC' start_ind = 121228 frame_num = 3 fns = [] for ind in np.arange(frame_num, dtype=np.int) + start_ind: if ind < 100000: fns.append('{}_{:05d}_00001.tif'.format(identifier, ind)) elif ind < 1000000: fns.append('{}_{:06d}_00001.tif'.format(identifier, ind)) elif ind < 10000000: fns.append('{}_{:07d}_00001.tif'.format(identifier, ind)) f = plt.figure(figsize=(5, 12)) for frame_i in range(frame_num): ax = f.add_subplot(frame_num, 1, frame_i+1) ax.imshow(ia.array_nor(tf.imread(os.path.join(data_folder, fns[frame_i]))), cmap='gray', vmin=0, vmax=0.5, interpolation='nearest') ax.set_title(fns[frame_i]) ax.set_axis_off() plt.tight_layout() plt.show()