python中连接的组件标签

时间:2017-09-27 07:28:39

标签: python-2.7 opencv image-processing connected-components

如何使用open cv在python中实现连接组件标签? 这是一个图像示例:

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

2 个答案:

答案 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)

Labeled image

答案 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,...)。这涉及仅出于美学目的而更改标签“名称”。