python 中的连通分量标记

connected component labeling in python

如何用open cv在python中实现连通分量标注? 这是一个图像示例:

我需要连接组件标记来分隔黑白图像上的对象。

OpenCV 3.0 docs for connectedComponents() don't mention Python but it actually is implemented. See for e.g. . On OpenCV 3.4.0 and above, the docs do include the Python signatures, as can be seen on the current master docs.

函数调用很简单:num_labels, labels_im = cv2.connectedComponents(img) 并且您可以指定参数 connectivity 来检查 4 路或 8 路(默认)连接。不同之处在于,4 向连接只是检查顶部、底部、左侧和右侧像素,看它们是否连接; 8 路检查八个相邻像素中的任何一个是否连接。如果你有对角线连接(就像你在这里做的那样),你应该指定 connectivity=8。请注意,它只是对每个组件进行编号,并为它们提供从 0 开始递增的整数标签。因此所有的零都相连,所有的零都相连,等等。如果你想可视化它们,你可以将这些数字映射到特定的颜色。我喜欢把它们映射成不同的色调,组合成HSV图像,然后转成BGR显示。以下是您的图片示例:

import cv2
import numpy as np

img = cv2.imread('eGaIy.jpg', 0)
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]  # ensure binary
num_labels, labels_im = cv2.connectedComponents(img)

def imshow_components(labels):
    # Map component labels to hue val
    label_hue = np.uint8(179*labels/np.max(labels))
    blank_ch = 255*np.ones_like(label_hue)
    labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])

    # cvt to BGR for display
    labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)

    # set bg label to black
    labeled_img[label_hue==0] = 0

    cv2.imshow('labeled.png', labeled_img)
    cv2.waitKey()

imshow_components(labels_im)

我对2D CCL的改编是:

1) 将图像转换为1/0图像,1为对象像素,0为背景像素。

2) 通过实施带通道压缩的联合查找算法,制作一个 2 通道 CCL 算法。你可以看到更多here

在此 CCL 实现的第一遍中,如果您的目标像素是对象像素,您将检查相邻像素,并比较它们之间的标签,以便您可以在它们之间生成等效项。您将对象像素(标签> 0)的那些相邻像素中的最少标签分配给目标像素。这样,您不仅为目标像素分配了一个对象标签(标签>0),而且还创建了一个等价列表。

2) 在第二遍中,您遍历所有像素,并通过查看存储在联合查找 class.

3) 我实施了一个附加通道,使标签遵循顺序 (1,2,3,4....) 而不是随机顺序 (23,45,1,...)。这涉及仅出于美观目的更改标签 "name"。