From 370d4d765c97d13f608e234b22e7756dcc7f3832 Mon Sep 17 00:00:00 2001 From: David Northover Date: Mon, 13 Oct 2025 20:59:13 -0400 Subject: [PATCH] Re-added Color Channel support to Backprojection - rgb photometric vs minisblack file saving --- .coverage | Bin 122880 -> 126976 bytes python/ouroboros/helpers/files.py | 19 +++++++++--------- python/ouroboros/helpers/shapes.py | 2 ++ python/ouroboros/helpers/slice.py | 19 ++++++++++-------- .../pipeline/backproject_pipeline.py | 14 +++++++------ 5 files changed, 31 insertions(+), 23 deletions(-) diff --git a/.coverage b/.coverage index 172cde34d6d9cef8b68d826d3e923f3ed4667983..c6fe2e99bc99b90e8286f58b9e493d7b82d6c40e 100644 GIT binary patch literal 126976 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 literal 122880 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 E3wU~3_y7O^ diff --git a/python/ouroboros/helpers/files.py b/python/ouroboros/helpers/files.py index b2e33bf..a8cb17e 100644 --- a/python/ouroboros/helpers/files.py +++ b/python/ouroboros/helpers/files.py @@ -194,15 +194,16 @@ def load_z_intermediate(path: Path, offset: int = 0): def increment_volume(path: Path, vol: np.ndarray, offset: int = 0, cleanup=False): indicies, values, weights = load_z_intermediate(path, offset) - np.add.at(vol[0], indicies, values) - np.add.at(vol[1], indicies, weights) + for i in range(0, vol.shape[0] - 1): + np.add.at(vol[i], indicies, np.atleast_2d(values)[i]) + np.add.at(vol[-1], indicies, weights) if cleanup: path.unlink() def volume_from_intermediates(path: Path, shape: DataShape, thread_count: int = 4): - vol = np.zeros((2, np.prod((shape.Y, shape.X))), dtype=np.float32) + vol = np.zeros((1 + shape.C, np.prod((shape.Y, shape.X))), dtype=np.float32) with ThreadPool(thread_count) as pool: if not path.exists(): # We don't have any intermediate(s) for this value, so return empty. @@ -214,9 +215,9 @@ def volume_from_intermediates(path: Path, shape: DataShape, thread_count: int = offset_set = range(0, len(tif.series), 4) pool.starmap(increment_volume, [(path, vol, i, False) for i in offset_set]) - nz = np.flatnonzero(vol[0]) - vol[0, nz] /= vol[1, nz] - return vol[0] + nz = np.flatnonzero(vol[-1]) + vol[:-1, nz] /= vol[-1, nz] + return vol[:-1] def write_conv_vol(writer: callable, source_path, shape, dtype, scaling, target_folder, index, interpolation): @@ -228,7 +229,7 @@ def write_conv_vol(writer: callable, source_path, shape, dtype, scaling, target_ start = time.perf_counter() # CV2 is only 2D but we're resizing from the 1D image anyway at the moment. new_volume = cv2.resize( - np_convert(dtype, vol.reshape(shape.Y, shape.X), normalize=False, safe_bool=True), + np_convert(dtype, vol.T.reshape(shape.Y, shape.X, shape.C), normalize=False, safe_bool=True), None, fx=scaling[1], fy=scaling[2], interpolation=interpolation) perf["Zoom"] = time.perf_counter() - start start = time.perf_counter() @@ -237,7 +238,7 @@ def write_conv_vol(writer: callable, source_path, shape, dtype, scaling, target_ perf["Write Merged"] = time.perf_counter() - start else: start = time.perf_counter() - writer(target_folder.joinpath(f"{index}"), - data=np_convert(dtype, vol.reshape(shape.Y, shape.X), normalize=False, safe_bool=True)) + writer(target_folder.joinpath(f"{index}.tif"), + data=np_convert(dtype, vol.T.reshape(shape.Y, shape.X, shape.C), normalize=False, safe_bool=True)) perf["Write Merged"] = time.perf_counter() - start return perf diff --git a/python/ouroboros/helpers/shapes.py b/python/ouroboros/helpers/shapes.py index 1bfd2f5..eacd73b 100644 --- a/python/ouroboros/helpers/shapes.py +++ b/python/ouroboros/helpers/shapes.py @@ -208,6 +208,8 @@ def of(cls, source: DataShape): @dataclass class ImgSlice(DataShape): Y: int; X: int # noqa: E701,E702 @dataclass +class ImgSliceC(DataShape): Y: int; X: int; C: int # noqa: E701,E702 +@dataclass class Proj(DataShape): Y: int; X: int # noqa: E701,E702 @dataclass class YSlice(DataShape): Theta: int; X: int # noqa: E701,E702 diff --git a/python/ouroboros/helpers/slice.py b/python/ouroboros/helpers/slice.py index 577ba2f..1f9845e 100644 --- a/python/ouroboros/helpers/slice.py +++ b/python/ouroboros/helpers/slice.py @@ -168,7 +168,7 @@ def slice_volume_from_grids( def _apply_weights(values, weights, corner): # This looks stupid but is twice as fast as fancy indexing with prod c_weights = weights[corner[0], 0, :] * weights[corner[1], 1, :] * weights[corner[2], 2, :] - w_values = values * c_weights + w_values = values * c_weights[..., np.newaxis] return w_values, c_weights @@ -188,13 +188,15 @@ def backproject_box(bounding_box: BoundingBox, slice_rects: np.ndarray, slices: # No slices, just return return np.empty((0), dtype=np.uint32), np.empty(0, dtype=np.float32), np.empty(0, dtype=np.float32) + channels = 1 if len(slices.shape) < 4 else slices.shape[-1] + # Plot the backprojected X/Y/Z coordinates for each of the slice rects in this chunk. - grid_call = partial(coordinate_grid, shape=slices[0].shape, floor=bounding_box.get_min(), flip=True) + grid_call = partial(coordinate_grid, shape=slices[0].shape[:2], floor=bounding_box.get_min(), flip=True) precise_points = np.concatenate(list(map(grid_call, slice_rects))) # Flatten values to 1-Dimension Array for Efficient Allocation. # Use ZYX domain rather than XYZ as the former is what is written to disk. - values = slices.flatten() + values = slices.flatten().reshape(-1, channels) zyx_shape = np.flip(bounding_box.get_shape()) flat_shape = np.prod(zyx_shape) @@ -202,7 +204,7 @@ def backproject_box(bounding_box: BoundingBox, slice_rects: np.ndarray, slices: squish_type = np.min_scalar_type(flat_shape) # Allocate the flattened data volume. - volume = np.zeros((2, flat_shape), dtype=np.float32) + volume = np.zeros((1 + channels, flat_shape), dtype=np.float32) # Get the top corner (integer) points and full weight matrix. points, weights = _points_and_weights(precise_points.reshape(-1, 3).T, zyx_shape, squish_type) @@ -212,14 +214,15 @@ def backproject_box(bounding_box: BoundingBox, slice_rects: np.ndarray, slices: w_values, c_weights = _apply_weights(values, weights, corner) point_inc = np.ravel_multi_index(corner, zyx_shape).astype(squish_type) - np.add.at(volume[0], points + point_inc, w_values) - np.add.at(volume[1], points + point_inc, c_weights) + for i in range(0, channels): + np.add.at(volume[i], points + point_inc, w_values[..., i]) + np.add.at(volume[-1], points + point_inc, c_weights) # Get indicies of the flattened Z-Y-X backprojected domain that have values. - nz_vol = np.flatnonzero(volume[0]) + nz_vol = np.flatnonzero(volume[-1]) # Return indicies and only the volume region with values. - return nz_vol, volume[0, nz_vol].squeeze(), volume[1, nz_vol].squeeze() + return nz_vol, volume[:-1, nz_vol].squeeze(), volume[-1, nz_vol].squeeze() def make_volume_binary(volume: np.ndarray, dtype=np.uint8) -> np.ndarray: diff --git a/python/ouroboros/pipeline/backproject_pipeline.py b/python/ouroboros/pipeline/backproject_pipeline.py index b011154..2c7283b 100644 --- a/python/ouroboros/pipeline/backproject_pipeline.py +++ b/python/ouroboros/pipeline/backproject_pipeline.py @@ -34,7 +34,7 @@ write_conv_vol, write_small_intermediate ) -from ouroboros.helpers.shapes import DataRange, ImgSlice +from ouroboros.helpers.shapes import DataRange, ImgSliceC DEFAULT_CHUNK_SIZE = 160 @@ -84,10 +84,12 @@ def _process(self, input_data: any) -> tuple[any, None] | tuple[None, any]: # tiff format check to add FPShape = FrontProjStack(D=len(list(Path(straightened_volume_path).iterdir())), V=tif.pages[0].shape[0], U=tif.pages[0].shape[1]) + channels = 1 if len(tif.pages[0].shape) < 3 else tif.pages[0].shape[-1] else: with tifffile.TiffFile(straightened_volume_path) as tif: is_compressed = bool(tif.pages[0].compression) FPShape = FrontProjStack(D=len(tif.pages), V=tif.pages[0].shape[0], U=tif.pages[0].shape[1]) + channels = 1 if len(tif.pages[0].shape) < 3 else tif.pages[0].shape[-1] cannot_memmap = False try: @@ -154,7 +156,8 @@ def _process(self, input_data: any) -> tuple[any, None] | tuple[None, any]: tif_write = partial(generate_tiff_write, compression=config.backprojection_compression, micron_resolution=volume_cache.get_resolution_um(), - backprojection_offset=bp_offset) + backprojection_offset=bp_offset, + photometric="rgb" if channels > 1 else "minisblack") if pipeline_input.slice_options.output_mip_level != config.output_mip_level: scaling_factors, _ = calculate_scaling_factors( @@ -165,7 +168,6 @@ def _process(self, input_data: any) -> tuple[any, None] | tuple[None, any]: ) else: scaling_factors = None - print(f"SF: {scaling_factors}") # Allocate procs equally between BP math and writing if we're rescaling, otherwise 3-1 favoring # the BP calculation. @@ -233,7 +235,7 @@ def note_written(write_future): write_conv_vol, tif_write(tifffile.imwrite), i_path.joinpath(f"i_{index:05}"), - ImgSlice(*write_shape[1:]), + ImgSliceC(*write_shape[1:], channels), bool if config.make_backprojection_binary else np.uint16, scaling_factors, folder_path, @@ -316,7 +318,7 @@ def process_chunk( durations["back_project"] = [time.perf_counter() - start] durations["total_bytes"] = [int(lookup.nbytes + values.nbytes + weights.nbytes)] - if len(values) == 0: + if values.nbytes == 0: # No data to write from this chunk, so return as such. durations["total_process"] = [time.perf_counter() - start_total] return durations, index, [] @@ -354,7 +356,7 @@ def write_z(i, z_slice): file_path.joinpath(f"i_{offset_z:05}").mkdir(exist_ok=True, parents=True) write_small_intermediate(file_path.joinpath(f"i_{offset_z:05}", f"{index}.tif"), np.fromiter(offset_dict.values(), dtype=np.uint32, count=4), - yx_vals[z_slice], values[z_slice], weights[z_slice]) + yx_vals[z_slice], np.atleast_2d(values)[:, z_slice], weights[z_slice]) with ThreadPool(12) as pool: pool.starmap(write_z, enumerate(z_slices))