def testRepresentativePoint(self): image = np.zeros([300, 200], dtype=np.uint8) image = draw_square_by_corner(image, 50, (150, 50), color=255) slices = mask_to_objects_2d(image) y, x = representative_point(slices[0].polygon, image, label=255) self.assertEqual(image[y, x], 255)
def testTwoPoints(self): mask = np.array([[0, 0, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0]], dtype=np.uint8) polygon = Polygon([(1, 1), (1, 2), (3, 2), (3, 1), (1, 1)]) slices = mask_to_objects_2d(mask) self.assertEqual(len(slices), 1) self.assertTrue(slices[0].polygon.equals(polygon))
def testOffset(self): image = np.zeros([300, 200], dtype=np.uint8) image = draw_square_by_corner(image, 100, (150, 50), color=255) slices = mask_to_objects_2d(image, offset=(320, 255)) self.assertEqual(len(slices), 1) self.assertEqual(slices[0].label, 255) self.assertTrue(slices[0].polygon.equals(box(305, 470, 406, 571)), msg="Polygon is equal")
def testExportOneSquare(self): image = np.zeros([300, 200], dtype=np.uint8) image = draw_square_by_corner(image, 100, (150, 50), color=255) slices = mask_to_objects_2d(image) self.assertEqual(len(slices), 1) self.assertEqual(slices[0].label, 255) self.assertTrue(slices[0].polygon.equals(box(50, 150, 151, 251)), msg="Polygon is equal")
def extract_tiled_annotations(in_tiles, out_path, nj, label_merging=False): """ in_images: iterable List of BiaflowsTile out_path: str Path of output tiles nj: BiaflowsJob A BIAflows job object label_merging: bool True for merging only polygons having the same label. False for merging based on geometry only """ # regroup tiles by original images grouped_tiles = defaultdict(list) for in_tile in in_tiles: grouped_tiles[in_tile.in_image.original_filename].append(in_tile) default_tile_builder = DefaultTileBuilder() annotations = AnnotationCollection() for tiles in grouped_tiles.values(): # recreate the topology in_image = tiles[0].in_image topology = BiaflowsSldcImage(in_image, is_2d=True).tile_topology( default_tile_builder, max_width=nj.flags["tile_width"], max_height=nj.flags["tile_height"], overlap=nj.flags["tile_overlap"]) # extract polygons for each tile ids, polygons, labels = list(), list(), list() label = -1 for tile in tiles: out_tile_path = os.path.join(out_path, tile.filename) slices = mask_to_objects_2d(imread(out_tile_path), offset=tile.tile.abs_offset[::-1]) ids.append(tile.tile.identifier) polygons.append([s.polygon for s in slices]) labels.append([s.label for s in slices]) # save label for use after merging if len(slices) > 0: label = slices[0] # merge merged = SemanticMerger(tolerance=1).merge( ids, polygons, topology, labels=labels if label_merging else None) if label_merging: merged = merged[0] annotations.extend([ create_annotation_from_slice( _slice=AnnotationSlice(p, label), id_image=in_image.object.id, image_height=in_image.object.height, id_project=nj.project.id, ) for p in merged ]) return annotations
def testAdjacentWithoutSeperation(self): image = np.zeros([300, 200], dtype=np.uint8) image = draw_square_by_corner(image, 50, (150, 50), color=255) image = draw_square_by_corner(image, 50, (150, 101), color=127) slices = mask_to_objects_2d(image) # sort by bounding box top left corner slices = sorted(slices, key=lambda s: s.polygon.bounds[:2]) self.assertEqual(len(slices), 2) self.assertEqual(slices[0].label, 255) self.assertEqual(slices[1].label, 127)
def skeleton_mask_to_objects_2d(mask, background=0, offset=None): """Process a 2d skeleton mask Parameters ---------- mask: ndqrrqy background: int offset: tuple """ dilated = morphology.dilation(mask, selem=morphology.selem.disk(2)) return mask_to_objects_2d(dilated, background=background, offset=offset)
def testOtherPixels(self): mask = np.array( [[0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 1, 1], [0, 0, 1, 0, 1, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0]], dtype=np.uint8) p1 = Polygon([(1, 1), (1, 2), (2, 2), (2, 3), (3, 3), (3, 1), (1, 1)]) p2 = Polygon([(4, 1), (4, 3), (5, 3), (5, 2), (6, 2), (6, 1), (4, 1)]) p3 = Polygon([(3, 3), (3, 4), (4, 4), (4, 3), (3, 3)]) slices = mask_to_objects_2d(mask) self.assertEqual(len(slices), 3) self.assertTrue(slices[0].polygon.equals(p1)) self.assertTrue(slices[1].polygon.equals(p2)) self.assertTrue(slices[2].polygon.equals(p3))
def testSmallObject(self): image = np.zeros([100, 100], dtype=np.uint8) image = draw_poly(image, Polygon([(15, 77), (15, 78), (16, 78), (15, 77)]), color=127) image = draw_poly(image, box(1, 1, 2, 2), color=255) slices = mask_to_objects_2d(image) # sort by bounding box top left corner slices = sorted(slices, key=lambda s: s.polygon.bounds[:2]) self.assertEqual(len(slices), 2) self.assertEqual(slices[0].label, 255) self.assertEqual(slices[1].label, 127)
def testSeveralObjects(self): image = np.zeros([300, 200], dtype=np.uint8) image = draw_square_by_corner(image, 50, (150, 50), color=255) image = draw_square_by_corner(image, 50, (205, 105), color=127) slices = mask_to_objects_2d(image) # sort by bounding box top left corner slices = sorted(slices, key=lambda s: s.polygon.bounds[:2]) self.assertEqual(len(slices), 2) self.assertEqual(slices[0].label, 255) self.assertTrue(slices[0].polygon.equals(box(50, 150, 101, 201)), msg="Polygon is equal") self.assertEqual(slices[1].label, 127) self.assertTrue(slices[1].polygon.equals(box(105, 205, 156, 256)), msg="Polygon is equal")