Example #1
0
 def test_create(self, mask_prop):
     roi_info = ROIInfo(np.zeros((10, 10), dtype=np.uint8))
     elem = HistoryElement.create(roi_info, None, {}, mask_prop)
     assert elem.mask_property == mask_prop
     assert elem.roi_extraction_parameters == {}
     param = {"a": 1, "b": 2}
     elem2 = HistoryElement.create(roi_info, None, param, mask_prop)
     assert elem2.roi_extraction_parameters == param
     roi_info2, mask = elem2.get_roi_info_and_mask()
     assert np.all(roi_info2.roi == 0)
     assert mask is None
Example #2
0
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)
        roi_info = result.roi_info.fit_to_image(image)
        report_fun("step", 2 * i + 1)
        new_mask = calculate_mask(
            mask_description=el.mask_property,
            roi=roi_info.roi,
            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(roi_info, 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_info, result.additional_layers, mask,
                          history, text)
Example #3
0
def create_history_element_from_project(project_info: ProjectTuple,
                                        mask_property: MaskProperty):
    return HistoryElement.create(
        roi_info=project_info.roi_info,
        mask=project_info.mask,
        roi_extraction_parameters=project_info.algorithm_parameters,
        mask_property=mask_property,
    )
Example #4
0
def create_history_element_from_segmentation_tuple(project_info: MaskProjectTuple, mask_property: MaskProperty):
    return HistoryElement.create(
        roi_info=project_info.roi_info,
        mask=project_info.mask,
        roi_extraction_parameters={
            "selected": project_info.selected_components,
            "parameters": project_info.roi_extraction_parameters,
        },
        mask_property=mask_property,
    )
Example #5
0
 def test_mask(self, mask_prop):
     mask = np.zeros((10, 10), dtype=np.uint8)
     mask[1:-1, 1:-1] = 2
     mask2 = np.copy(mask)
     mask2[2:-2, 2:-2] = 4
     roi_info = ROIInfo(mask2)
     elem = HistoryElement.create(roi_info, mask, {}, mask_prop)
     roi_info2, mask2 = elem.get_roi_info_and_mask()
     assert np.all(mask == mask2)
     assert np.all(roi_info.roi == roi_info2.roi)
Example #6
0
    def test_base_settings_history(self, tmp_path, qtbot, monkeypatch):
        settings = base_settings.BaseSettings(tmp_path)
        assert settings.history_size() == 0
        assert settings.history_redo_size() == 0
        hist_elem = HistoryElement({"a": 1}, None, MaskProperty.simple_mask(),
                                   BytesIO())
        hist_elem2 = HistoryElement({"a": 2}, None, MaskProperty.simple_mask(),
                                    BytesIO())
        hist_elem3 = HistoryElement({"a": 3}, None, MaskProperty.simple_mask(),
                                    BytesIO())
        settings.add_history_element(hist_elem)
        assert settings.history_size() == 1
        assert settings.history_redo_size() == 0
        settings.add_history_element(hist_elem2)
        assert settings.history_size() == 2
        assert settings.history_redo_size() == 0
        assert settings.history_pop().roi_extraction_parameters["a"] == 2
        assert settings.history_current_element(
        ).roi_extraction_parameters["a"] == 1
        assert settings.history_next_element(
        ).roi_extraction_parameters["a"] == 2
        assert settings.history_redo_size() == 1
        assert settings.history_size() == 1
        assert len(settings.get_history()) == 1
        assert settings.get_history()[-1].roi_extraction_parameters["a"] == 1
        settings.add_history_element(hist_elem3)
        settings.history_pop()
        settings.history_redo_clean()
        assert settings.history_redo_size() == 0
        settings.history_pop()
        assert settings.history_pop() is None
        assert settings.history_size() == 0
        assert settings.history_redo_size() == 1

        settings.set_history([hist_elem, hist_elem2])
        assert settings.get_history()[-1].roi_extraction_parameters["a"] == 2
        assert settings.history_size() == 2
        assert settings.history_redo_size() == 0
        settings.history_pop()
        monkeypatch.setattr(settings, "cmp_history_element", lambda x, y: True)
        settings.add_history_element(hist_elem3)
Example #7
0
 def test_annotations(self, mask_prop):
     data = np.zeros((10, 10), dtype=np.uint8)
     data[1:5, 1:5] = 1
     data[5:-1, 1:5] = 2
     data[1:5, 5:-1] = 3
     data[5:-1, 5:-1] = 4
     annotations = {1: "a", 2: "b", 3: "c", 4: "d"}
     roi_info = ROIInfo(data, annotations=annotations)
     elem = HistoryElement.create(roi_info, None, {}, mask_prop)
     roi_info2, mask2 = elem.get_roi_info_and_mask()
     assert mask2 is None
     assert np.all(roi_info2.roi == roi_info.roi)
Example #8
0
 def test_additional(self, mask_prop):
     data = np.zeros((10, 10), dtype=np.uint8)
     data[1:-1, 1:-1] = 2
     alternative = {}
     for i in range(4):
         alternative_array = np.copy(data)
         alternative_array[alternative_array > 0] = i + 2
         alternative[f"add{i}"] = alternative_array
     roi_info = ROIInfo(data, alternative=alternative)
     elem = HistoryElement.create(roi_info, None, {}, mask_prop)
     roi_info2, mask2 = elem.get_roi_info_and_mask()
     assert np.all(roi_info2.roi == roi_info.roi)
     assert mask2 is None
     assert len(roi_info.alternative) == 4
     assert set(roi_info.alternative) == {f"add{i}" for i in range(4)}
     for i in range(4):
         arr = roi_info.alternative[f"add{i}"]
         assert np.all(arr[arr > 0] == i + 2)
Example #9
0
 def perform_roi_info_history_test(
     self, project, save_path, mask_property, save_method: Type[SaveBase], load_method: Type[LoadBase]
 ):
     alt1 = np.copy(project.roi_info.roi)
     alt1[alt1 > 0] += 3
     roi_info = ROIInfo(
         roi=project.roi_info.roi, annotations={i: f"a{i}" for i in range(1, 5)}, alternative={"test": alt1}
     )
     history = []
     for i in range(3):
         alt2 = np.copy(alt1)
         alt2[alt2 > 0] = i + 5
         roi_info2 = ROIInfo(
             roi=project.roi_info.roi,
             annotations={i: f"a{i}_{j}" for j in range(1, 5)},
             alternative={f"test{i}": alt2},
         )
         history.append(
             HistoryElement.create(
                 roi_info2, alt1, {"algorithm_name": f"task_{i}", "values": {"a": 1}}, mask_property
             )
         )
     proj = dataclasses.replace(project, roi_info=roi_info, history=history)
     save_method.save(save_path / "data.tgz", proj, SaveROI.get_default_values())
     proj2: ProjectInfoBase = load_method.load([save_path / "data.tgz"])
     assert np.all(proj2.roi_info.roi == project.roi_info.roi)
     assert set(proj2.roi_info.annotations) == {1, 2, 3, 4}
     assert proj2.roi_info.annotations == {i: f"a{i}" for i in range(1, 5)}
     assert "test" in proj2.roi_info.alternative
     assert np.all(proj2.roi_info.alternative["test"] == alt1)
     assert len(proj2.history) == 3
     for i in range(3):
         roi_info3, mask2 = proj2.history[i].get_roi_info_and_mask()
         assert np.all(mask2 == alt1)
         assert set(roi_info3.alternative) == {f"test{i}"}
         assert np.all(roi_info3.alternative[f"test{i}"][alt1 > 0] == i + 5)
         assert np.all(roi_info3.alternative[f"test{i}"][alt1 == 0] == 0)
         assert roi_info3.annotations == {i: f"a{i}_{j}" for j in range(1, 5)}
         assert proj2.history[i].roi_extraction_parameters == {"algorithm_name": f"task_{i}", "values": {"a": 1}}