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"。
如何用open cv在python中实现连通分量标注? 这是一个图像示例:
我需要连接组件标记来分隔黑白图像上的对象。
OpenCV 3.0 docs for connectedComponents()
don't mention Python but it actually is implemented. See for e.g.
函数调用很简单: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"。