def test_overlap_merge(self, objects_x, objects_y, module, workspace): # Test handling of overlapping objects in 'merge' mode segment_x = numpy.zeros((10, 10)) segment_x[2][2] = 1 segment_x[2][3] = 1 segment_x[3][2] = 1 segment_x[3][3] = 1 objects_x.segmented = segment_x segment_y = numpy.zeros((10, 10)) segment_y[3][3] = 1 segment_y[3][4] = 1 segment_y[4][3] = 1 segment_y[4][4] = 1 objects_y.segmented = segment_y module.merge_method.value = "Merge" module.run(workspace) merged = workspace.get_objects("merged") assert len(merged.indices) == 1 expected_segment = numpy.zeros_like(segment_x) expected_segment[segment_y > 0] = 1 expected_segment[segment_x > 0] = 1 assert (merged.segmented == expected_segment).all()
def test_run_binary(workspace, module): module.object_name.value = "inputobjects" module.image_name.value = "outputimage" module.image_mode.value = "Binary (black & white)" module.run(workspace) image = workspace.image_set.get_image("outputimage") objects = workspace.get_objects("inputobjects") assert image.dimensions == objects.segmented.ndim pixel_data = image.pixel_data assert pixel_data.shape == objects.shape if objects.segmented.ndim == 2: assert not pixel_data[0, 0] assert numpy.all(pixel_data[:, 1:]) assert numpy.all(pixel_data[1:, :]) else: assert not numpy.all(pixel_data[:, 0, 0]) assert numpy.all(pixel_data[:, :, 1:]) assert numpy.all(pixel_data[:, 1:, :])
def test_run_grayscale(workspace, module): module.object_name.value = "inputobjects" module.image_name.value = "outputimage" module.image_mode.value = "Grayscale" module.run(workspace) image = workspace.image_set.get_image("outputimage") objects = workspace.get_objects("inputobjects") assert image.dimensions == objects.segmented.ndim pixel_data = image.pixel_data assert pixel_data.shape == objects.shape expected = numpy.reshape( numpy.arange(256).astype(numpy.float32) / 255, (16, 16)) if objects.segmented.ndim == 3: expected = numpy.tile(expected, (3, 1)) expected = numpy.reshape(expected, (3, 16, 16)) assert numpy.all(pixel_data == expected)
def test_one_object_second_image(self, objects_y, module, workspace, merge_methods): # Test merge methods with one object in target set segment = numpy.zeros((10, 10)) segment[2:4, 2:4] = 1 objects_y.segmented = segment for method in merge_methods: module.merge_method.value = method module.output_object.value = method module.run(workspace) numpy.testing.assert_array_equal( workspace.get_objects(method).segmented, segment)
def test_duplicate_object(self, objects_x, objects_y, module, workspace, merge_methods): # Test merge methods with same object in both sets segment = numpy.zeros((10, 10)) segment[2:4, 2:4] = 1 objects_x.segmented = segment objects_y.segmented = segment for method in merge_methods: module.merge_method.value = method module.output_object.value = method module.run(workspace) numpy.testing.assert_array_equal( workspace.get_objects(method).segmented, segment)
def test_one_object_first_image(self, objects_x, module, workspace, merge_methods): # Test merge methods with one object in initial set segment = numpy.zeros((10, 10)) segment[2][2] = 1 segment[2][3] = 1 segment[3][2] = 1 segment[3][3] = 1 objects_x.segmented = segment for method in merge_methods: module.merge_method.value = method module.output_object.value = method module.run(workspace) assert ( workspace.get_objects(method).segmented == segment).all()
def test_duplicate_object(self, objects_x, module, workspace, merge_methods): # Test merge methods with same object in both sets segment = numpy.zeros((10, 10)) segment[2][2] = 1 segment[2][3] = 1 segment[3][2] = 1 segment[3][3] = 1 objects_x.segmented = segment objects_y.segmented = segment for method in merge_methods: module.merge_method.value = method module.output_object.value = method module.run(workspace) assert ( workspace.get_objects(method).segmented == segment).all()
def test_overlap_discard(self, objects_x, objects_y, module, workspace): # Test handling of overlapping objects in 'discard' mode segment_x = numpy.zeros((10, 10)) segment_x[2:4, 2:4] = 1 objects_x.segmented = segment_x segment_y = numpy.zeros((10, 10)) segment_y[3, 3:5] = 1 objects_y.segmented = segment_y module.merge_method.value = "Discard" module.run(workspace) merged = workspace.get_objects("merged") assert len(merged.indices) == 1 expected_segment = segment_x numpy.testing.assert_array_equal(merged.segmented, expected_segment)
def test_not_touching(self, objects_x, objects_y, module, workspace, merge_methods): # Test merge methods with two distinct objects segment_x = numpy.zeros((10, 10)) segment_x[2:4, 2:4] = 1 objects_x.segmented = segment_x segment_y = numpy.zeros((10, 10)) segment_y[8:10, 8:10] = 1 objects_y.segmented = segment_y for method in merge_methods: module.merge_method.value = method module.output_object.value = method module.run(workspace) combined = workspace.get_objects(method) assert len(combined.indices) == 2 numpy.testing.assert_array_equal(combined.segmented, segment_x + 2 * segment_y)
def test_overlap_segment(self, objects_x, objects_y, module, workspace): # Test handling of overlapping objects in 'segment' mode segment_x = numpy.zeros((10, 10)) segment_x[1:5, 1:6] = 1 objects_x.segmented = segment_x segment_y = numpy.zeros((10, 10)) segment_y[1:6, 4:9] = 1 objects_y.segmented = segment_y module.merge_method.value = "Segment" module.run(workspace) merged = workspace.get_objects("merged") assert len(merged.indices) == 2 expected_segment = numpy.zeros_like(segment_x) expected_segment[1:6, 4:9] = 2 expected_segment[1:5, 1:5] = 1 assert (merged.segmented == expected_segment).all()
def test_overlap_preserve(self, objects_x, objects_y, module, workspace): # Test handling of overlapping objects in 'preserve' mode segment_x = numpy.zeros((10, 10)) segment_x[2:4, 2:4] = 1 objects_x.segmented = segment_x segment_y = numpy.zeros((10, 10)) segment_y[3, 3:5] = 1 objects_y.segmented = segment_y module.merge_method.value = "Preserve" module.run(workspace) merged = workspace.get_objects("merged") assert len(merged.indices) == 2 expected_segment = numpy.zeros_like(segment_x) expected_segment[segment_y > 0] = 2 expected_segment[segment_x > 0] = 1 numpy.testing.assert_array_equal(merged.segmented, expected_segment)
def test_run_color(workspace, module): for color in [ "Default", "autumn", "bone", "colorcube", "cool", "copper", "flag", "gray", "hot", "hsv", "jet", "lines", "pink", "prism", "spring", "summer", "white", "winter", ]: module.object_name.value = "inputobjects" module.image_name.value = "outputimage" module.image_mode.value = "Color" module.colormap.value = color module.run(workspace) image = workspace.image_set.get_image("outputimage") objects = workspace.get_objects("inputobjects") assert image.dimensions == objects.segmented.ndim pixel_data = image.pixel_data assert pixel_data.shape == objects.shape + (3, )
def test_for_inappropriate_merge(self, objects_x, objects_y, module, workspace, merge_methods): # Test that adjacent objects in the source set aren't merged inappropriately. segmentation_x = numpy.zeros((10, 10)) segmentation_x[2, 2:4] = 1 segmentation_x[3, 2:4] = 2 segmentation_y = numpy.zeros((10, 10)) segmentation_y[6, 6] = 3 objects_x.segmented = segmentation_x objects_y.segmented = segmentation_y segmentation_expected = segmentation_x + segmentation_y for method in merge_methods: module.merge_method.value = method module.output_object.value = method module.run(workspace) merged = workspace.get_objects(method) assert len(merged.indices) == 3 numpy.testing.assert_array_equal(merged.segmented, segmentation_expected)
def test_not_touching(self, objects_x, objects_y, module, workspace, merge_methods): # Test merge methods with two distinct objects segment_x = numpy.zeros((10, 10)) segment_x[2][2] = 1 segment_x[2][3] = 1 segment_x[3][2] = 1 segment_x[3][3] = 1 objects_x.segmented = segment_x segment_y = numpy.zeros((10, 10)) segment_y[8][8] = 1 segment_y[8][9] = 1 segment_y[9][8] = 1 segment_y[9][9] = 1 objects_y.segmented = segment_y for method in merge_methods: module.merge_method.value = method module.output_object.value = method module.run(workspace) combined = workspace.get_objects(method) assert len(combined.indices) == 2 assert (combined.segmented == segment_x + 2 * segment_y).all()