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)
Example #2
0
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'))
Example #3
0
    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/')
Example #4
0
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])
Example #5
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/')
Example #6
0
 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,
Example #12
0
 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)