如何使用open cv在python中实现连接组件标签? 这是一个图像示例:
我需要连接组件标签来分隔黑白图像上的对象。
答案 0 :(得分:26)
OpenCV 3.0 docs for connectedComponents()
没有提及Python,但实际上已经实现了。参见例如this SO question。在OpenCV 3.4.0及更高版本中,文档确实包含Python签名,可以在[当前主文档(https://docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gaedef8c7340499ca391d459122e51bef5)上看到。
函数调用很简单:retval, labels = 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
ret, labels = 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)
答案 1 :(得分:0)
我在2D模式下对CCL的修改是:
1)将图像转换为1/0图像,其中1为对象像素,0为背景像素。
2)通过实现带有通道压缩的Union-Find算法,制作一个2通道CCL算法。您可以看到更多here。
在此CCL实现的“第一遍”中,如果目标像素是对象像素,则检查相邻像素,并比较它们之间的标签,以便可以在它们之间生成等效项。在对象像素(label> 0)的那些相邻像素中,您分配最少的标签到目标像素。这样,您不仅要为目标像素集分配一个标签(标签> 0),而且还要创建一个等效列表。
2)在第二遍中,您遍历所有像素,并通过查看存储在Union-Find类中的等效表来通过其父标签的标签更改其先前的标签。
3)我实施了另一遍操作,使标签遵循顺序顺序(1,2,3,4 ....)而不是随机顺序(23,45,1,...)。这涉及仅出于美学目的而更改标签“名称”。