def test_possible_hull(): image = np.array( [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 1, 1, 1, 1, 1, 0, 0], [0, 1, 1, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=np.uint8) expected = np.array([[1, 4], [2, 3], [3, 2], [4, 1], [4, 1], [3, 2], [2, 3], [1, 4], [2, 5], [3, 6], [4, 7], [2, 5], [3, 6], [4, 7], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6]]) ph = possible_hull(image) assert_array_equal(ph, expected)
def get_possible_hull(img): coords = _convex_hull.possible_hull( np.ascontiguousarray(img, dtype=np.uint8)) return img, coords
edge_includers.insert(0, dummy_edge) offset_mask = np.invert(edge_includers).T offset_idx = np.argwhere(offset_mask.ravel()).ravel() coords = (coords[:, np.newaxis, :] + offsets).reshape(-1, img.ndim)[offset_idx] return coords SAMPLE = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1], [0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]]) rp = regionprops(SAMPLE)[0] img = SAMPLE.astype(np.bool) coords = _convex_hull.possible_hull(np.ascontiguousarray(img, dtype=np.uint8)) offsets = _offsets_diamond(img.ndim) # Apply bugfix to apply these offsets in a partial (valid/limited) way to the coords coords = apply_partial_offsets(img, coords, offsets) hull = ConvexHull(coords) vertices = hull.points[hull.vertices] hull_perim_r, hull_perim_c = polygon_perimeter(vertices[:, 0], vertices[:, 1]) mask = np.zeros(img.shape, dtype=np.bool) mask[hull_perim_r, hull_perim_c] = True