diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f191c11..1235623 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - python-version: [3.7, 3.8, 3.9] + python-version: [3.8, 3.9] steps: - name: Checkout diff --git a/examples/example_converter.py b/examples/example_converter.py index de9587c..8633a8a 100644 --- a/examples/example_converter.py +++ b/examples/example_converter.py @@ -15,7 +15,7 @@ # If you don't have any data to try on, you can run the 'example_create_synthetic_dataset.py' script # We then parse this data using the parser: -tiles = paprica.tileParser(path=path, frame_size=2048) +tiles = paprica.tileParser(path=path, frame_size_h=2048, frame_size_v=2048) # Next, we batch convert the data. Please refer to the original paper to understand and set correctly the # conversion parameters. The parameters that do not appear below are automatically determined but can also be @@ -27,6 +27,6 @@ ) # It is also possible to batch reconstruct data -tiles_tiff = paprica.tileParser(path='path_to_tiff_data', frame_size=2048) +tiles_tiff = paprica.tileParser(path='path_to_tiff_data', frame_size_h=2048, frame_size_v=2048) converter = paprica.tileConverter(tiles_tiff) converter.batch_reconstruct_pixel() diff --git a/examples/example_segmentation.py b/examples/example_segmentation.py index fda34a1..02b8189 100644 --- a/examples/example_segmentation.py +++ b/examples/example_segmentation.py @@ -51,7 +51,7 @@ def compute_features(apr, parts): # If you don't have any data to try on, you can run the 'example_create_synthetic_dataset.py' script # We then parse this data using the parser -tiles = paprica.tileParser(path=path, frame_size=2048, ftype='apr') +tiles = paprica.tileParser(path=path, frame_size_h=2048, frame_size_v=2048, ftype='apr') # Here we will manually train the segmenter on the first tile trainer = paprica.tileTrainer(tiles[0, 0], func_to_compute_features=compute_features) diff --git a/examples/example_stitching.py b/examples/example_stitching.py index 3f070dc..29891d7 100644 --- a/examples/example_stitching.py +++ b/examples/example_stitching.py @@ -15,7 +15,7 @@ # If you don't have any data to try on, you can run the 'example_create_synthetic_dataset.py' script # We then parse this data using the parser -tiles = paprica.tileParser(path=path, frame_size=2048, ftype='apr') +tiles = paprica.tileParser(path=path, frame_size_h=2048, frame_size_v=2048, ftype='apr') # The previous parser expect the data to be in y_x.apr naming convention, this behavior can be adapted by creating # your own parsing class that inherits from tileParser. We provide an example for COLM data where we just need to # parse the data to associate each tile with its position on the grid: diff --git a/paprica/converter.py b/paprica/converter.py index 1852be6..91c02c8 100644 --- a/paprica/converter.py +++ b/paprica/converter.py @@ -192,7 +192,8 @@ def batch_convert_to_apr(self, if self.is_multitile: # Modify tileParser object to use APR instead self.tiles = paprica.parser.tileParser(folder_apr, - frame_size=self.tiles.frame_size, + frame_size_h=self.tiles.frame_size_h, + frame_size_v=self.tiles.frame_size_v, ftype='apr') def batch_reconstruct_pixel(self, mode='constant', progress_bar=True): diff --git a/paprica/loader.py b/paprica/loader.py index 02795dc..939b17f 100644 --- a/paprica/loader.py +++ b/paprica/loader.py @@ -46,7 +46,8 @@ def tile_from_apr(apr, parts): neighbors=None, neighbors_tot=None, neighbors_path=None, - frame_size=2048, + frame_size_h=apr.shape(2), + frame_size_v=apr.shape(1), folder_root=None, channel=None) @@ -76,7 +77,8 @@ def tile_from_path(path): neighbors=None, neighbors_tot=None, neighbors_path=None, - frame_size=2048, + frame_size_h=2048, + frame_size_v=2048, folder_root=os.path.basename(path), channel=None) @@ -86,7 +88,16 @@ class tileLoader(): Class to load each tile, neighboring tiles, segmentation and neighboring segmentation. """ - def __init__(self, path, row, col, ftype, neighbors, neighbors_tot, neighbors_path, frame_size, folder_root, + def __init__(self, path, + row, + col, + ftype, + neighbors, + neighbors_tot, + neighbors_path, + frame_size_h, + frame_size_v, + folder_root, channel): """ Constructor of tileLoader object. @@ -131,8 +142,10 @@ def __init__(self, path, row, col, ftype, neighbors, neighbors_tot, neighbors_pa in this case neighbors_tot = [[0, 0], [0, 2], [1, 1]] neighbors_path: list path of the neighbors whose coordinates are stored in neighbors - frame_size: int - camera frame size (only square sensors are supported for now). + frame_size_h: int + horizontal camera frame size. + frame_size_v: int + vertical camera frame size. folder_root: str root folder where everything should be saved. channel: int @@ -147,7 +160,8 @@ def __init__(self, path, row, col, ftype, neighbors, neighbors_tot, neighbors_pa self.neighbors = neighbors self.neighbors_tot = neighbors_tot self.neighbors_path = neighbors_path - self.frame_size = frame_size + self.frame_size_h = frame_size_h + self.frame_size_v = frame_size_v self.folder_root = folder_root self.channel = channel self.is_loaded = False @@ -373,7 +387,7 @@ def _load_data(self, path): elif self.type == 'clearscope': u = self._load_clearscope(path) elif self.type == 'tiff3D': - u = imread(path) + u = np.squeeze(imread(path)) elif self.type == 'apr': apr = pyapr.APR() parts = pyapr.ShortParticles() @@ -401,7 +415,7 @@ def _load_raw(self, path): numpy array containing the data. """ u = np.fromfile(path, dtype='uint16', count=-1) - return u.reshape((-1, self.frame_size, self.frame_size)) + return u.reshape((-1, self.frame_size_v, self.frame_size_h)) def _load_colm(self, path): """ @@ -419,7 +433,7 @@ def _load_colm(self, path): """ files_sorted = sorted(glob(os.path.join(path, '*CHN0' + str(self.channel) + '_*tif'))) n_files = len(files_sorted) - v = np.empty((n_files, self.frame_size, self.frame_size), dtype='uint16') + v = np.empty((n_files, self.frame_size_v, self.frame_size_h), dtype='uint16') for i, f in enumerate(tqdm(files_sorted, desc='Loading sequence', leave=False)): v[i] = imread(f) return v @@ -440,7 +454,7 @@ def _load_clearscope(self, path): """ files_sorted = sorted(glob(os.path.join(path, '*'))) n_files = len(files_sorted) - v = np.empty((n_files, self.frame_size, self.frame_size), dtype='uint16') + v = np.empty((n_files, self.frame_size_v, self.frame_size_h), dtype='uint16') for i, f in enumerate(tqdm(files_sorted, desc='Loading sequence', leave=False)): v[i] = imread(f) diff --git a/paprica/parser.py b/paprica/parser.py index 0b9d186..5b21c96 100644 --- a/paprica/parser.py +++ b/paprica/parser.py @@ -99,7 +99,7 @@ class baseParser(): Class used to parse several independent tiles (not multitile). """ - def __init__(self, path, frame_size, ftype, verbose=True): + def __init__(self, path, frame_size_h, frame_size_v, ftype, verbose=True): """ Constructor of the baseParser object. @@ -107,14 +107,17 @@ def __init__(self, path, frame_size, ftype, verbose=True): ---------- path: string path where to look for the data. - frame_size: int - size of each frame (camera resolution). + frame_size_h: int + horizontal camera frame size. + frame_size_v: int + vertical camera frame size. ftype: string input data type in 'apr', 'tiff2D' or 'tiff3D' """ self.path = path - self.frame_size = frame_size + self.frame_size_h = frame_size_h + self.frame_size_v = frame_size_v self.type = ftype self.channel = None self.tiles_list = self._get_tile_list() @@ -403,7 +406,8 @@ def __getitem__(self, item): neighbors=self.neighbors, neighbors_tot=self.neighbors_tot, neighbors_path=self.neighbors_path, - frame_size=self.frame_size, + frame_size_h=self.frame_size_h, + frame_size_v=self.frame_size_v, folder_root=self.folder_root, channel=self.channel) @@ -429,7 +433,8 @@ def __iter__(self): neighbors=self.neighbors, neighbors_tot=self.neighbors_tot, neighbors_path=self.neighbors_path, - frame_size=self.frame_size, + frame_size_h=self.frame_size_h, + frame_size_v=self.frame_size_v, folder_root=self.folder_root, channel=self.channel) @@ -447,7 +452,7 @@ class tileParser(baseParser): stitched later on. """ - def __init__(self, path, frame_size=2048, ftype=None, verbose=True): + def __init__(self, path, frame_size_h=2048, frame_size_v=2048, ftype=None, verbose=True): """ Constructor of the tileParser object. @@ -455,15 +460,18 @@ def __init__(self, path, frame_size=2048, ftype=None, verbose=True): ---------- path: string path where to look for the data. - frame_size: int - size of each frame (camera resolution). + frame_size_h: int + horizontal camera frame size. + frame_size_v: int + vertical camera frame size. ftype: string input data type in 'apr', 'tiff2D' or 'tiff3D' """ self.path = path - self.frame_size = frame_size + self.frame_size_h = frame_size_h + self.frame_size_v = frame_size_v self.channel = None if ftype is None: self.type = self._get_type() @@ -602,7 +610,8 @@ def __getitem__(self, item): neighbors=neighbors, neighbors_tot=neighbors_tot, neighbors_path=neighbors_path, - frame_size=self.frame_size, + frame_size_h=self.frame_size_h, + frame_size_v=self.frame_size_v, folder_root=self.folder_root, channel=self.channel) @@ -626,7 +635,8 @@ def __getitem__(self, item): neighbors=neighbors, neighbors_tot=neighbors_tot, neighbors_path=neighbors_path, - frame_size=self.frame_size, + frame_size_h=self.frame_size_h, + frame_size_v=self.frame_size_v, folder_root=self.folder_root, channel=self.channel) @@ -665,7 +675,8 @@ def __iter__(self): neighbors=neighbors, neighbors_tot=neighbors_tot, neighbors_path=neighbors_path, - frame_size=self.frame_size, + frame_size_h=self.frame_size_h, + frame_size_v=self.frame_size_v, folder_root=self.folder_root, channel=self.channel) @@ -712,7 +723,7 @@ def __init__(self, path, channel=0, verbose=True): self.ncol = u.shape[1] self.nrow = u.shape[0] path = os.path.join(path, 'VW0') - super().__init__(path, frame_size=2048, ftype='colm', verbose=verbose) + super().__init__(path, frame_size_h=2048, frame_size_v=2048, ftype='colm', verbose=verbose) self.channel = channel @@ -832,7 +843,8 @@ def __init__(self, path, channel=0, verbose=True): self.channel = channel self.folder_settings, self.name_acq = os.path.split(path) self._parse_settings() - self.frame_size = 2048 + self.frame_size_h = 2048 + self.frame_size_v = 2048 self.type = 'clearscope' self.tiles_list = self._get_tile_list() self.n_tiles = len(self.tiles_list) @@ -1074,7 +1086,8 @@ def _get_n_channels(path): # """ # # self.path = path -# self.frame_size = 2048 +# self.frame_size_h = 2048 +# self.frame_size_v = 2048 # self.channel = channel # self.channel_wavelength = self._get_channel_wavelength(channel) # self.type = 'mesospim' diff --git a/paprica/runner.py b/paprica/runner.py index e68b839..4970ca1 100644 --- a/paprica/runner.py +++ b/paprica/runner.py @@ -54,7 +54,8 @@ def __init__(self, path, n_channels, output_path=None): self.folder_settings = path self.name_acq = os.path.basename(path) # self.folder_settings, self.name_acq = os.path.split(path) - self.frame_size = 2048 + self.frame_size_h = 2048 + self.frame_size_v = 2048 self.n_channels = n_channels self.tile_processed = 0 self.type = 'clearscope' @@ -101,8 +102,8 @@ def __init__(self, path, n_channels, output_path=None): self.segment = False self.segmenter = None - self.reg_x = int(self.frame_size*0.05) - self.reg_y = int(self.frame_size*0.05) + self.reg_x = int(self.frame_size_h*0.05) + self.reg_y = int(self.frame_size_v*0.05) self.reg_z = 20 self.z_begin = None @@ -375,11 +376,11 @@ def set_overlap_margin(self, margin): raise ValueError('Error: overlap margin is too small and may make the stitching fail.') self.overlap_h = int(self.expected_overlap_h*(1+margin/100)) - if self.expected_overlap_h > self.frame_size: - self.expected_overlap_h = self.frame_size + if self.expected_overlap_h > self.frame_size_h: + self.expected_overlap_h = self.frame_size_h self.overlap_v = int(self.expected_overlap_v*(1+margin/100)) - if self.expected_overlap_v > self.frame_size: - self.expected_overlap_v = self.frame_size + if self.expected_overlap_v > self.frame_size_v: + self.expected_overlap_v = self.frame_size_v def reconstruct_slice(self, loc=None, n_proj=0, dim=0, downsample=1, color=False, debug=False, plot=True, progress_bar=True): """ @@ -676,11 +677,11 @@ def _parse_acquisition_settings(self): self.expected_overlap_h = int(self.acq_param['VSThrowAwayXRight']*2) self.overlap_h = int(self.expected_overlap_h*1.2) - if self.expected_overlap_h > self.frame_size: - self.expected_overlap_h = self.frame_size + if self.expected_overlap_h > self.frame_size_h: + self.expected_overlap_h = self.frame_size_h self.overlap_v = int(self.expected_overlap_v*1.2) - if self.expected_overlap_v > self.frame_size: - self.expected_overlap_v = self.frame_size + if self.expected_overlap_v > self.frame_size_v: + self.expected_overlap_v = self.frame_size_v print('\nAcquisition parameters:' '\n- number of row: {}' @@ -690,8 +691,8 @@ def _parse_acquisition_settings(self): '\n- horizontal overlap: {:0.2f}%' '\n- vertical overlap: {:0.2f}%' .format(self.nrow, self.ncol, self.n_planes, self.n_channels, - self.expected_overlap_h/self.frame_size*100, - self.expected_overlap_v/self.frame_size*100)) + self.expected_overlap_h/self.frame_size_h*100, + self.expected_overlap_v/self.frame_size_v*100)) def _is_new_tile_available(self): """ @@ -838,7 +839,8 @@ def _get_tile(self, path): neighbors=neighbors, neighbors_tot=None, neighbors_path=None, - frame_size=2048, + frame_size_h=2048, + frame_size_v=2048, folder_root=self.path, channel=channel) @@ -982,12 +984,12 @@ def _project_tile(self, tile): # EAST 1 patch = pyapr.ReconPatch() - patch.y_begin = self.frame_size - self.overlap_h + patch.y_begin = self.frame_size_h - self.overlap_h if self.z_begin is None: proj['east'] = _get_max_proj_apr(tile.apr, tile.parts, patch, plot=False) else: patch_yx = pyapr.ReconPatch() - patch_yx.y_begin = self.frame_size - self.overlap_h + patch_yx.y_begin = self.frame_size_h - self.overlap_h patch_yx.z_begin = self.z_begin patch_yx.z_end = self.z_end proj['east'] = _get_max_proj_apr(tile.apr, tile.parts, patch=patch, patch_yx=patch_yx, @@ -1055,12 +1057,12 @@ def _project_tile(self, tile): # SOUTH 1 patch = pyapr.ReconPatch() - patch.x_begin = self.frame_size - self.overlap_v + patch.x_begin = self.frame_size_v - self.overlap_v if self.z_begin is None: proj['south'] = _get_max_proj_apr(tile.apr, tile.parts, patch, plot=False) else: patch_yx = pyapr.ReconPatch() - patch_yx.x_begin = self.frame_size - self.overlap_v + patch_yx.x_begin = self.frame_size_v - self.overlap_v patch_yx.z_begin = self.z_begin patch_yx.z_end = self.z_end proj['south'] = _get_max_proj_apr(tile.apr, tile.parts, patch=patch, patch_yx=patch_yx, @@ -1210,16 +1212,16 @@ def _print_info(self): None """ overlap = np.median(np.diff(np.median(self.registration_map_abs[0], axis=0))) - self.effective_overlap_h = (self.frame_size-overlap)/self.frame_size*100 + self.effective_overlap_h = (self.frame_size_h-overlap)/self.frame_size_h*100 print('Effective horizontal overlap: {:0.2f}%'.format(self.effective_overlap_h)) overlap = np.median(np.diff(np.median(self.registration_map_abs[1], axis=1))) - self.effective_overlap_v = (self.frame_size-overlap)/self.frame_size*100 + self.effective_overlap_v = (self.frame_size_v-overlap)/self.frame_size_v*100 print('Effective vertical overlap: {:0.2f}%'.format(self.effective_overlap_v)) - if np.abs(self.effective_overlap_v*self.frame_size/100-self.expected_overlap_v)>0.2*self.expected_overlap_v: + if np.abs(self.effective_overlap_v*self.frame_size_v/100-self.expected_overlap_v)>0.2*self.expected_overlap_v: warnings.warn('Expected vertical overlap is very different from the computed one, the registration ' 'might be wrong.') - if np.abs(self.effective_overlap_h*self.frame_size/100-self.expected_overlap_h)>0.2*self.expected_overlap_h: + if np.abs(self.effective_overlap_h*self.frame_size_h/100-self.expected_overlap_h)>0.2*self.expected_overlap_h: warnings.warn('Expected horizontal overlap is very different from the computed one, the registration ' 'might be wrong.') @@ -1335,10 +1337,10 @@ def _produce_registration_map(self): reg_abs_map = np.zeros_like(reg_rel_map) # H for x in range(reg_abs_map.shape[2]): - reg_abs_map[0, :, x] = reg_rel_map[0, :, x] + x * (self.frame_size-self.overlap_h) + reg_abs_map[0, :, x] = reg_rel_map[0, :, x] + x * (self.frame_size_h-self.overlap_h) # V for x in range(reg_abs_map.shape[1]): - reg_abs_map[1, x, :] = reg_rel_map[1, x, :] + x * (self.frame_size-self.overlap_v) + reg_abs_map[1, x, :] = reg_rel_map[1, x, :] + x * (self.frame_size_h-self.overlap_v) # D reg_abs_map[2] = reg_rel_map[2] self.registration_map_abs = reg_abs_map diff --git a/paprica/segmenter.py b/paprica/segmenter.py index e93e9ee..5ad4f31 100644 --- a/paprica/segmenter.py +++ b/paprica/segmenter.py @@ -463,7 +463,8 @@ def __init__(self, self.neighbors = tiles.neighbors self.n_edges = tiles.n_edges self.path_list = tiles.path_list - self.frame_size = tiles.frame_size + self.frame_size_h = tiles.frame_size_h + self.frame_size_v = tiles.frame_size_v self.verbose = verbose self.cells = None diff --git a/paprica/stitcher.py b/paprica/stitcher.py index dc3d5d5..45f3b6c 100644 --- a/paprica/stitcher.py +++ b/paprica/stitcher.py @@ -4,13 +4,13 @@ With this submodule the user can stitch a previously parsed dataset, typically the autofluorescence channel: >>> import paprica ->>> tiles_autofluo = paprica.parser.tileParser(path_to_autofluo, frame_size=1024, overlap=25) +>>> tiles_autofluo = paprica.parser.tileParser(path_to_autofluo, frame_size_h=1024, frame_size_v=1024, overlap=25) >>> stitcher = paprica.stitcher.tileStitcher(tiles_autofluo) >>> stitcher.compute_registration_fast() Others channel can then easily stitched using the previous one as reference: ->>> tiles_signal = paprica.parser.tileParser(path_to_data, frame_size=1024, overlap=25) +>>> tiles_signal = paprica.parser.tileParser(path_to_data, frame_size_h=1024, frame_size_v=1024, overlap=25) >>> stitcher_channel = paprica.stitcher.channelStitcher(stitcher, tiles_autofluo, tiles_signal) >>> stitcher_channel.compute_rigid_registration() @@ -491,17 +491,18 @@ def __init__(self, self.nrow = tiles.nrow self.n_vertex = tiles.n_tiles self.n_edges = tiles.n_edges - self.frame_size = tiles.frame_size + self.frame_size_h = tiles.frame_size_h + self.frame_size_v = tiles.frame_size_v - self.expected_overlap_h = int(overlap_h/100*self.frame_size) - self.expected_overlap_v = int(overlap_v/100*self.frame_size) + self.expected_overlap_h = int(overlap_h/100*self.frame_size_h) + self.expected_overlap_v = int(overlap_v/100*self.frame_size_v) self.overlap_h = int(self.expected_overlap_h*1.2) - if self.expected_overlap_h > self.frame_size: - self.expected_overlap_h = self.frame_size + if self.expected_overlap_h > self.frame_size_h: + self.expected_overlap_h = self.frame_size_h self.overlap_v = int(self.expected_overlap_v*1.2) - if self.expected_overlap_v > self.frame_size: - self.expected_overlap_v = self.frame_size + if self.expected_overlap_v > self.frame_size_v: + self.expected_overlap_v = self.frame_size_v self.mask = False self.threshold = None @@ -509,8 +510,8 @@ def __init__(self, self.segment = False self.segmenter = None - self.reg_x = int(self.frame_size*0.05) - self.reg_y = int(self.frame_size*0.05) + self.reg_x = int(self.frame_size_h*0.05) + self.reg_y = int(self.frame_size_v*0.05) self.reg_z = 20 self.z_begin = None @@ -1243,12 +1244,12 @@ def _precompute_max_projs(self, progress_bar=True): if self.tiles.tiles_pattern[tile.row, tile.col + 1] == 1: # EAST 1 patch = pyapr.ReconPatch() - patch.y_begin = self.frame_size - self.overlap_h + patch.y_begin = self.frame_size_h - self.overlap_h if self.z_begin is None: proj['east'] = _get_max_proj_apr(tile.apr, tile.parts, patch, plot=False) else: patch_yx = pyapr.ReconPatch() - patch_yx.y_begin = self.frame_size - self.overlap_h + patch_yx.y_begin = self.frame_size_h - self.overlap_h patch_yx.z_begin = self.z_begin patch_yx.z_end = self.z_end proj['east'] = _get_max_proj_apr(tile.apr, tile.parts, patch=patch, patch_yx=patch_yx, @@ -1271,12 +1272,12 @@ def _precompute_max_projs(self, progress_bar=True): if self.tiles.tiles_pattern[tile.row + 1, tile.col] == 1: # SOUTH 1 patch = pyapr.ReconPatch() - patch.x_begin = self.frame_size - self.overlap_v + patch.x_begin = self.frame_size_v - self.overlap_v if self.z_begin is None: proj['south'] = _get_max_proj_apr(tile.apr, tile.parts, patch, plot=False) else: patch_yx = pyapr.ReconPatch() - patch_yx.x_begin = self.frame_size - self.overlap_v + patch_yx.x_begin = self.frame_size_v - self.overlap_v patch_yx.z_begin = self.z_begin patch_yx.z_end = self.z_end proj['south'] = _get_max_proj_apr(tile.apr, tile.parts, patch=patch, patch_yx=patch_yx, @@ -1540,10 +1541,10 @@ def compute_expected_registration(self): reg_abs_map = np.zeros_like(reg_rel_map) # H for x in range(reg_abs_map.shape[2]): - reg_abs_map[0, :, x] = reg_rel_map[0, :, x] + x * (self.frame_size - self.expected_overlap_h) + reg_abs_map[0, :, x] = reg_rel_map[0, :, x] + x * (self.frame_size_h - self.expected_overlap_h) # V for x in range(reg_abs_map.shape[1]): - reg_abs_map[1, x, :] = reg_rel_map[1, x, :] + x * (self.frame_size - self.expected_overlap_v) + reg_abs_map[1, x, :] = reg_rel_map[1, x, :] + x * (self.frame_size_v - self.expected_overlap_v) # D reg_abs_map[2] = reg_rel_map[2] self.registration_map_abs = reg_abs_map @@ -1796,11 +1797,11 @@ def set_overlap_margin(self, margin): raise ValueError('Error: overlap margin is too small and may make the stitching fail.') self.overlap_h = int(self.expected_overlap_h*(1+margin/100)) - if self.expected_overlap_h > self.frame_size: - self.expected_overlap_h = self.frame_size + if self.expected_overlap_h > self.frame_size_h: + self.expected_overlap_h = self.frame_size_h self.overlap_v = int(self.expected_overlap_v*(1+margin/100)) - if self.expected_overlap_v > self.frame_size: - self.expected_overlap_v = self.frame_size + if self.expected_overlap_v > self.frame_size_v: + self.expected_overlap_v = self.frame_size_v def set_z_range(self, z_begin, z_end): """ @@ -1828,16 +1829,16 @@ def _print_info(self): """ overlap = np.median(np.diff(np.median(self.registration_map_abs[0], axis=0))) - self.effective_overlap_h = (self.frame_size-overlap)/self.frame_size*100 + self.effective_overlap_h = (self.frame_size_h-overlap)/self.frame_size_h*100 print('Effective horizontal overlap: {:0.2f}%'.format(self.effective_overlap_h)) overlap = np.median(np.diff(np.median(self.registration_map_abs[1], axis=1))) - self.effective_overlap_v = (self.frame_size-overlap)/self.frame_size*100 + self.effective_overlap_v = (self.frame_size_v-overlap)/self.frame_size_v*100 print('Effective vertical overlap: {:0.2f}%'.format(self.effective_overlap_v)) - if np.abs(self.effective_overlap_v*self.frame_size/100-self.expected_overlap_v)>0.2*self.expected_overlap_v: + if np.abs(self.effective_overlap_v*self.frame_size_v/100-self.expected_overlap_v)>0.2*self.expected_overlap_v: warnings.warn('Expected vertical overlap is very different from the computed one, the registration ' 'might be wrong.') - if np.abs(self.effective_overlap_h*self.frame_size/100-self.expected_overlap_h)>0.2*self.expected_overlap_h: + if np.abs(self.effective_overlap_h*self.frame_size_h/100-self.expected_overlap_h)>0.2*self.expected_overlap_h: warnings.warn('Expected horizontal overlap is very different from the computed one, the registration ' 'might be wrong.') @@ -1953,10 +1954,10 @@ def _produce_registration_map(self): reg_abs_map = np.zeros_like(reg_rel_map) # H for x in range(reg_abs_map.shape[2]): - reg_abs_map[0, :, x] = reg_rel_map[0, :, x] + x * (self.frame_size-self.overlap_h) + reg_abs_map[0, :, x] = reg_rel_map[0, :, x] + x * (self.frame_size_h-self.overlap_h) # V for x in range(reg_abs_map.shape[1]): - reg_abs_map[1, x, :] = reg_rel_map[1, x, :] + x * (self.frame_size-self.overlap_v) + reg_abs_map[1, x, :] = reg_rel_map[1, x, :] + x * (self.frame_size_v-self.overlap_v) # D reg_abs_map[2] = reg_rel_map[2] self.registration_map_abs = reg_abs_map @@ -2043,7 +2044,7 @@ def _compute_east_registration(self, apr_1, parts_1, apr_2, parts_2): None """ patch = pyapr.ReconPatch() - patch.y_begin = self.frame_size - self.overlap_h + patch.y_begin = self.frame_size_h - self.overlap_h proj_zy1, proj_zx1, proj_yx1 = _get_max_proj_apr(apr_1, parts_1, patch, plot=False) patch = pyapr.ReconPatch() @@ -2082,7 +2083,7 @@ def _compute_south_registration(self, apr_1, parts_1, apr_2, parts_2): None """ patch = pyapr.ReconPatch() - patch.x_begin = self.frame_size - self.overlap_v + patch.x_begin = self.frame_size_v - self.overlap_v proj_zy1, proj_zx1, proj_yx1 = _get_max_proj_apr(apr_1, parts_1, patch, plot=False) patch = pyapr.ReconPatch() @@ -2263,7 +2264,8 @@ def __init__(self, tiles, database): self.tiles = tiles self.lazy = self._find_if_lazy() self.type = tiles.type - self.frame_size = tiles.frame_size + self.frame_size_h = tiles.frame_size_h + self.frame_size_v = tiles.frame_size_v self.n_planes = self._get_n_planes() self.n_tiles = tiles.n_tiles self.n_row = tiles.nrow @@ -2567,7 +2569,7 @@ def _get_nx(self): x size for merged array """ x_pos = self.database['ABS_H'].to_numpy() - return x_pos.max() - x_pos.min() + self.frame_size + return x_pos.max() - x_pos.min() + self.frame_size_h def _get_ny(self): """ @@ -2579,7 +2581,7 @@ def _get_ny(self): y size for merged array """ y_pos = self.database['ABS_V'].to_numpy() - return y_pos.max() - y_pos.min() + self.frame_size + return y_pos.max() - y_pos.min() + self.frame_size_v def _get_nz(self): """ diff --git a/tests/manual_test_pipeline.py b/tests/manual_test_pipeline.py index 88d0727..5097ab0 100644 --- a/tests/manual_test_pipeline.py +++ b/tests/manual_test_pipeline.py @@ -68,7 +68,7 @@ def main(): # Parse data t_ini = time() - tiles = paprica.parser.tileParser(path, frame_size=512, ftype='apr') + tiles = paprica.parser.tileParser(path, frame_size_h=512, frame_size_v=512, ftype='apr') t = time() # Stitch diff --git a/tests/manual_test_train_segmentation.py b/tests/manual_test_train_segmentation.py index 2a10c93..cf8c4bd 100644 --- a/tests/manual_test_train_segmentation.py +++ b/tests/manual_test_train_segmentation.py @@ -61,7 +61,8 @@ def main(): path = 'data/apr' # We load a tile - tiles = paprica.parser.tileParser(path, frame_size=512, overlap=128, ftype='apr') + tiles = paprica.parser.tileParser(path, frame_size_h=512, frame_size_v=512, + overlap_h=128, overlap_v=128, ftype='apr') tile = tiles[2] tile.load_tile() diff --git a/tests/test_multitile_segmentation.py b/tests/test_multitile_segmentation.py index 33340ca..2877817 100644 --- a/tests/test_multitile_segmentation.py +++ b/tests/test_multitile_segmentation.py @@ -136,7 +136,8 @@ def test_main(): converter.batch_convert_to_apr(Ip_th=100, rel_error=0.4, path=os.path.join(path, 'APR')) # Parse synthetic data - tiles_apr = paprica.tileParser(os.path.join(path, 'APR'), frame_size=int(length / dH)) + tiles_apr = paprica.tileParser(os.path.join(path, 'APR'), + frame_size_h=int(length / dH), frame_size_v=int(length / dV)) # Stitch data-set stitcher = paprica.tileStitcher(tiles_apr, overlap_h=overlap_H, overlap_v=overlap_V) diff --git a/tests/test_parsing.py b/tests/test_parsing.py index f52b246..85f13a7 100644 --- a/tests/test_parsing.py +++ b/tests/test_parsing.py @@ -17,7 +17,7 @@ def test_main(): path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data', 'apr') # Parse data - tiles = paprica.parser.tileParser(path, frame_size=512, ftype='apr') + tiles = paprica.parser.tileParser(path, frame_size_h=512, frame_size_v=512, ftype='apr') tiles.check_files_integrity() tiles.compute_average_CR() @@ -26,7 +26,8 @@ def test_main(): assert(tiles.ncol == 4) assert(tiles.nrow == 4) assert(tiles.n_edges == 21) - assert(tiles.frame_size == 512) + assert(tiles.frame_size_h == 512) + assert(tiles.frame_size_v == 512) assert(tiles.path == path) assert(tiles.type == 'apr') diff --git a/tests/test_stitching.py b/tests/test_stitching.py index 870a220..1f7cb9c 100644 --- a/tests/test_stitching.py +++ b/tests/test_stitching.py @@ -17,7 +17,7 @@ def test_main(): path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data', 'apr') # Parse data - tiles = paprica.parser.tileParser(path, frame_size=512, ftype='apr') + tiles = paprica.parser.tileParser(path, frame_size_h=512, frame_size_v=512, ftype='apr') # Stitch data t = time() @@ -47,6 +47,7 @@ def test_main(): assert(len(stitcher1.database) == tiles.n_tiles) assert(stitcher1.nrow == tiles.nrow) assert(stitcher1.ncol == tiles.ncol) - assert(stitcher1.frame_size == tiles.frame_size) + assert(stitcher1.frame_size_h == tiles.frame_size_h) + assert(stitcher1.frame_size_v == tiles.frame_size_v) assert(stitcher1.n_edges == tiles.n_edges) assert(stitcher1.n_vertex == tiles.n_tiles) \ No newline at end of file