查找触摸对象的轮廓作为两个不同的轮廓

时间:2020-07-09 13:15:00

标签: python opencv contour

我想知道如何使用Python中的cv2.findContours将彼此连接的对象计数为两个不同的对象

例如,此图像:

enter image description here

contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

将输出一个轮廓。 我该怎么做才能得到两个轮廓?

1 个答案:

答案 0 :(得分:1)

这可以通过将输入图像转换为边缘图像然后检测轮廓来完成。但是在这种情况下,如下图所示,在两个对象的交点处,边缘图像(我尝试用canny)发生了断裂。

在Canny中崩溃:

break in canny

期望边缘图像的边界处的所有像素都应为白色。

预期的边缘图像:

expected edge image

因此,为了获得完美的边缘图像,我在下面创建了一个算法(该算法仅适用于具有白色填充对象的二进制图像)。

在使用此算法之前,请确保对象未位于边界上,即图像的所有边界像素均应为黑色。如果不是黑色,则在黑色图像的所有侧面上添加一个边框,长度为1像素。

XLSX

找到边缘图像后,获取图像中的所有轮廓:

# Creating black image of same shape and single channel
edge = np.zeros(img.shape, dtype = np.uint8)
h, w = img.shape[:2]

# Iterating over each pixel except those at the boundary
for i in range(1, h-1):
    for j in range(1, w-1):
        # if current pixel is white
        if img[i][j] == 255:
            # roi is the image of 9 pixel from around the current pixel
            roi = img[i-1:i+2, j-1:j+2].copy()
            # Counting number of black pixel in the neighbourhood of current pixel
            blackCount = np.sum(roi == 0)
            # if a neighbouring pixel is black, then current pixel is a boundary pixel.
            if blackCount > 0:
                edge[i][j] = 255

对于此图像,您将获得3个轮廓,两个对象2个,两个对象组合的1个。要消除两个对象组合在一起的轮廓,请使用层次结构信息。

cont, hier = cv2.findContours(edge, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

“ finalContours”将具有两个对象的2个轮廓。

Refer to this link for more information about the parent-child relationship of the contours