def calculate_pipeline(image: Image, mask: typing.Optional[np.ndarray], pipeline: SegmentationPipeline, report_fun): history = [] report_fun("max", 2 * len(pipeline.mask_history) + 1) for i, el in enumerate(pipeline.mask_history): result, _ = calculate_segmentation_step(el.segmentation, image, mask) segmentation = image.fit_array_to_image(result.roi) report_fun("step", 2 * i + 1) new_mask = calculate_mask( mask_description=el.mask_property, segmentation=segmentation, old_mask=mask, spacing=image.spacing, time_axis=image.time_pos, ) segmentation_parameters = { "algorithm_name": el.segmentation.name, "values": el.segmentation.values } history.append( HistoryElement.create(segmentation, mask, segmentation_parameters, el.mask_property)) report_fun("step", 2 * i + 2) mask = image.fit_array_to_image(new_mask) result, text = calculate_segmentation_step(pipeline.segmentation, image, mask) report_fun("step", 2 * len(pipeline.mask_history) + 1) return PipelineResult(result.roi, result.additional_layers, mask, history, text)
def save_components( image: Image, components: list, segmentation: np.ndarray, dir_path: str, segmentation_info: typing.Optional[SegmentationInfo] = None, range_changed=None, step_changed=None, ): if range_changed is None: range_changed = empty_fun if step_changed is None: step_changed = empty_fun segmentation = image.fit_array_to_image(segmentation) if segmentation_info is None: segmentation_info = SegmentationInfo(segmentation) os.makedirs(dir_path, exist_ok=True) file_name = os.path.splitext(os.path.basename(image.file_path))[0] range_changed(0, 2 * len(components)) for i in components: slices = segmentation_info.bound_info[i].get_slices() cut_segmentation = segmentation[tuple(slices)] cut_image = image.cut_image(slices) im = cut_image.cut_image(cut_segmentation == i, replace_mask=True) # print(f"[run] {im}") ImageWriter.save( im, os.path.join(dir_path, f"{file_name}_component{i}.tif")) step_changed(2 * i + 1) ImageWriter.save_mask( im, os.path.join(dir_path, f"{file_name}_component{i}_mask.tif")) step_changed(2 * i + 2)
def analysis_project() -> ProjectTuple: data = np.zeros((1, 50, 100, 100, 1), dtype=np.uint16) data[0, 10:40, 10:40, 10:90] = 50 data[0, 10:40, 50:90, 10:90] = 50 data[0, 15:35, 15:35, 15:85] = 70 data[0, 15:35, 55:85, 15:85] = 60 data[0, 10:40, 40:50, 10:90] = 40 image = Image( data, (10 / UNIT_SCALE[Units.nm.value], 5 / UNIT_SCALE[Units.nm.value], 5 / UNIT_SCALE[Units.nm.value]), "" ) mask = data[0, ..., 0] > 0 segmentation = np.zeros(data.shape, dtype=np.uint8) segmentation[data == 70] = 1 segmentation[data == 60] = 2 algorithm_parameters = { "algorithm_name": "Lower Threshold", "values": { "threshold": 60, "channel": 0, "noise_filtering": {"name": "None", "values": {}}, "minimum_size": 10, "side_connection": False, }, } segmentation = image.fit_array_to_image(segmentation.squeeze()) return ProjectTuple( file_path="test_data.tiff", image=image, roi=segmentation, additional_layers={"denoised image": AdditionalLayerDescription(data=segmentation, layer_type="layer")}, mask=mask, algorithm_parameters=algorithm_parameters, )
def analysis_project_reversed() -> ProjectTuple: data = np.zeros((1, 50, 100, 100, 1), dtype=np.uint16) data[0, 10:40, 10:40, 10:90] = 50 data[0, 10:40, 50:90, 10:90] = 50 data[0, 15:35, 15:35, 15:85] = 70 data[0, 15:35, 55:85, 15:85] = 60 data[0, 10:40, 40:50, 10:90] = 40 mask = data[0] > 0 segmentation = np.zeros(data.shape, dtype=np.uint8) segmentation[data == 70] = 1 segmentation[data == 60] = 2 data = 100 - data image = Image( data, (10 / UNIT_SCALE[Units.nm.value], 5 / UNIT_SCALE[Units.nm.value], 5 / UNIT_SCALE[Units.nm.value]), "" ) segmentation = image.fit_array_to_image(segmentation.squeeze()) return ProjectTuple("test_data.tiff", image, segmentation, mask=mask)