def extract_surfaces(**kwargs): """ Extract surface coordinates of each connected region in a given image. Keyword arguments ----------------- *inputfolder* : str Directory with the input image. *item* : str File name of the input image. *outputfolder* : str Directory to save the segmented image. *channelcodes* : list of str List of channel codes as they appear in the file names. *reconstruct* : bool, optional If True, surfaces will be reconstructed by the marching cube algorithm, and coordiantes of the vertices will be extracted. If False, coordinates of the voxels connected to the background will be extracted. Default is True. """ inputfolder = kwargs.get('inputfolder') outputfolder = kwargs.get('outputfolder', inputfolder + '../surfaces/') filename = kwargs.get('item') reconstruct = kwargs.get('reconstruct', True) channelcodes = kwargs.get('channelcodes') channel = None if channelcodes is not None: for i, cc in enumerate(channelcodes): if len(filename.split(cc)) > 1: channel = i if channelcodes is None or channel is not None: stack = ImageStack(inputfolder + filename) metadata = pd.read_csv(inputfolder + filename[:-4] + '.txt', sep='\t', index_col=0, header=None).transpose().iloc[0].T.squeeze() min_coord = None if 'min_x' in metadata.index and 'min_y' in metadata.index and 'min_z' in metadata.index: min_coord = [ metadata['min_z'], metadata['min_y'], metadata['min_x'] ] stack.filename = filename stack.extract_surfaces(outputfolder, voxel_size=[ metadata['voxel_size_z'], metadata['voxel_size_xy'], metadata['voxel_size_xy'] ], reconstruct=reconstruct, min_coord=min_coord)
def plot_maxprojections(**kwargs): """ Save a maximum projection of a given image. Keyword arguments ----------------- *inputfolder* : str Directory with the input image. *item* : str File name of the input image. *outputfolder* : str Directory to save the maximum projection image. """ inputfolder = kwargs.get('inputfolder') outputfolder = kwargs.get('outputfolder', inputfolder + '../output/maxprojection/') filename = kwargs.get('item') stack = ImageStack(inputfolder + filename) stack.save_max_projection(outputfolder + filename, axis=kwargs.get('axis'))
def test_load_and_save(self): fn = 'data/test_data/test_stack.tif' img = ImageStack(filename=fn, load=False) img.data = np.ones([10, 100, 100]) img.save(filename=fn) self.assertEqual(os.path.exists(fn), True) img = ImageStack(filename=fn) self.assertIsInstance(img.data, np.ndarray) shutil.rmtree('data/test_data/')
def overlay_tracks(**kwargs): inputfolder = kwargs.get('inputfolder') outputfolder = kwargs.get('outputfolder', inputfolder + '../output/RGB/') trackfolder = kwargs.get('track_folder') filenames = kwargs.get('item') voxel_size = np.array(kwargs.get('voxel_size')) group_keys = kwargs.get('group_keys') group_names = kwargs.get('group_names') sample_keys = kwargs.get('sample_keys') stacks = [] for i, fn in enumerate(filenames): if len(fn) > 0: stacks.append(ImageStack(inputfolder + fn)) data = np.zeros(stacks[0].data.shape + (3, )) for i in range(len(stacks)): data[:, :, :, i] = stacks[i].data stacks[0].data = data trackfiles = os.listdir(trackfolder) centers = np.zeros(np.array(stacks[0].data.shape)[:-1]) for fn in filenames: if fn != '': group, sample, time = metadata_from_filename( fn, group_keys, group_names, sample_keys) for trf in trackfiles: if len(trf.split(group)) > 1 and len(trf.split(sample)) > 1: trackstat = pd.read_csv(trackfolder + trf, sep='\t') trackstat = trackstat[trackstat['Time'] == time] x = np.int_( np.round_( np.array(trackstat['Position X']) / voxel_size[2])) y = np.int_( np.round_( np.array(trackstat['Position Y']) / voxel_size[1])) z = np.int_( np.round_( np.array(trackstat['Position Z']) / voxel_size[0])) centroids = np.array([z, y, x]).transpose().reshape( (len(trackstat), 3)) centers[tuple(centroids.transpose())] = 255. sigma = 0.25 / voxel_size centers = ndimage.gaussian_filter(centers, sigma) print(centers.max(), centers.min()) stacks[0].data[np.where(centers > 0)] = (255, 255, 255) stacks[0].save_max_projection(outputfolder + filenames[0])
def test_save_maxproj(self): fn = 'data/test_data/test_stack.tif' img = ImageStack(filename=fn, load=False) img.data = np.zeros([10, 100, 100]) img.data[2:7, 10:-10, 10:-10] = 50 img.save_max_projection(filename=fn) self.assertEqual(os.path.exists(fn), True) shutil.rmtree('data/test_data/')
def test_extract_surfaces(self): fn = 'data/test_data/test_stack.tif' img = ImageStack(filename=fn, load=False) img.data = np.zeros([10, 100, 100]) img.data[2:7, 10:-10, 10:-10] = 50 voxel_size = [4, 0.3824, 0.3824] img.extract_surfaces('data/test_data/surfaces/', voxel_size=voxel_size, reconstruct=False) img.extract_surfaces('data/test_data/surfaces_reconstructed/', voxel_size=voxel_size, reconstruct=True) files = os.listdir('data/test_data/surfaces_reconstructed/') self.assertEqual(len(files), 1) files = os.listdir('data/test_data/surfaces/') self.assertEqual(len(files), 1) shutil.rmtree('data/test_data/')
def test_interpolate(self, grid_size): img = ImageStack(filename='', load=False) img.data = np.zeros([10, 100, 100]) img.data[2:7, 10:-10, 10:-10] = 1 voxel_size = [4, 0.3824, 0.3824] img.extract_surfaces('data/test_data/surfaces/', voxel_size=voxel_size, reconstruct=False) surf = Surface(filename='data/test_data/surfaces/_Cell00001.csv') surf.centrate() surf.to_spherical() grid = surf.interpolate(grid_size=grid_size) self.assertEqual(len(grid), grid_size) shutil.rmtree('data/test_data/')
def test_transforms(self): img = ImageStack(filename='', load=False) img.data = np.zeros([10, 100, 100]) img.data[2:7, 10:-10, 10:-10] = 1 voxel_size = [4, 0.3824, 0.3824] img.extract_surfaces('data/test_data/surfaces/', voxel_size=voxel_size, reconstruct=False) surf = Surface(filename='data/test_data/surfaces/_Cell00001.csv') surf.to_spherical() x, y, z = tr.spherical_to_cart(surf.R, surf.theta, surf.phi) self.assertAlmostEqual(np.sum(np.abs(surf.x - x)), 0, 7) self.assertAlmostEqual(np.sum(np.abs(surf.y - y)), 0, 7) self.assertAlmostEqual(np.sum(np.abs(surf.z - z)), 0, 7) shutil.rmtree('data/test_data/')
def test_spharm_transform(self): img = ImageStack(filename='', load=False) img.data = np.zeros([100, 100, 100]) img.data[48:52, 48:52, 48:52] = 1. voxel_size = 0.3 img.extract_surfaces('data/test_data/surfaces/', voxel_size=voxel_size, reconstruct=True) surf = Surface(filename='data/test_data/surfaces/_Cell00001.csv') surf.centrate() surf.to_spherical() grid = surf.interpolate(grid_size=10) surf.compute_spharm(grid_size=10) ngrid = surf.inverse_spharm() self.assertAlmostEqual(np.mean(np.abs(ngrid - grid)), 0, 1) shutil.rmtree('data/test_data/')
def test_read_surface_and_save_as_stack(self): img = ImageStack(filename='', load=False) img.data = np.zeros([10, 100, 100]) img.data[2:7, 10:-10, 10:-10] = 1 voxel_size = [4, 0.3824, 0.3824] img.extract_surfaces('data/test_data/surfaces/', voxel_size=voxel_size, reconstruct=False) surf = Surface(filename='data/test_data/surfaces/_Cell00001.csv') for coord in ['x', 'y', 'z']: self.assertIsNotNone(surf.__dict__[coord]) surf.save_as_stack(filename='data/test_data/stack.tif', voxel_size=0.5) self.assertEqual(os.path.exists('data/test_data/stack.tif'), True) self.assertEqual(os.path.exists('data/test_data/stack.txt'), True) shutil.rmtree('data/test_data/')
if len(args) > 0: path = args[0] if path != 'test': if not path.endswith('/'): path += '/' path += 'output/' track_stat = pd.DataFrame() summary_stat = pd.DataFrame() groups = os.listdir(path + 'stacks/') for gr in groups: print(gr) files = os.listdir(path + 'stacks/' + gr + '/') for fn in files: print(fn) stack = ImageStack(path + 'stacks/' + gr + '/' + fn) stack.filename = fn stack.extract_surfaces(path + 'surfaces/' + gr + '/', voxel_size=0.3) groups = os.listdir(path + 'surfaces/') for gr in groups: print(gr) files = os.listdir(path + 'surfaces/' + gr + '/') files.sort() for fn in files: print(fn) surface = Surface(filename=path + 'surfaces/' + gr + '/' + fn, voxel_size=0.3) mesh = mlab.points3d(surface.x, surface.y,
def test_parse_filename(self, case): fn, tp, ch = case path = 'data/test_data//SPHARM/tests/' img = ImageStack(filename=path + fn, load=False) self.assertEqual(img.timepoint, tp) self.assertEqual(img.channel, ch)