检测分段标签的边框像素

时间:2015-02-08 10:03:12

标签: python image-processing scikit-image

我可以使用skimage计算SLIC边界,如下所示:

def compute_superpixels(frame, num_pixels=100, std=5, iter_max=10,
                        connectivity=False, compactness=10.0):

    return slic(frame, n_segments=num_pixels, sigma=std, max_iter=iter_max,
                enforce_connectivity=connectivity, compactness=compactness)

现在,我想做的是获得构成每个标签边界的像素索引。所以我的想法是让所有像素属于给定的片段,然后检查哪些像素在所有两个方向都有变化

def boundary_pixels(segments, index):
    # Get all pixels having a given index
    x, y = np.where(segments == index)

    right = x + 1
    # check we are in bounds
    right_mask = right < segments.shape[0]
    down = y + 1
    down_mask = down < segments.shape[1]
    left = x - 1
    left_mask = left >= 0  
    up = y - 1
    up_mask = up >= 0  

    neighbors_1 = np.union1d(right_n, down_n)
    neighbors_2 = np.union1d(left_n, up_n)
    neighbors = np.union1d(neighbors_1, neighbors_2)

    # Not neighbours to ourselves
    neighbors = np.delete(neighbors, np.where(neighbors == i))

然而,有了这一切,我设法做的就是让邻居在给定标签的4个方向上。有人可以提出一些方法来实际获取标签边框上的所有像素。

2 个答案:

答案 0 :(得分:1)

您可以使用skimage.measure模块中提供的find_contours函数来查找边界像素的坐标。 find_contours.提供了一个示例。接下来,您可以根据需要更改两个方向的更改。

答案 1 :(得分:1)

我找到了自己问题的答案。 skimage.segmentation包中的mark_boundaries完全符合我的需要。

用法:

processed = mark_boundaries(frame, segments==some_segment)

这里的帧是当前的图像帧,而segment是标签数组。 some_segment是我们感兴趣的标签整数索引。