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)
Exemple #3
0
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,
    )
Exemple #4
0
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)