Python 将接触对象的轮廓作为两个不同的轮廓查找

Python 将接触对象的轮廓作为两个不同的轮廓查找,python,opencv,contour,Python,Opencv,Contour,我想知道如何使用Python中的cv2.findContours将相互连接的对象计算为两个不同的对象 例如,此图像: 将输出一个轮廓。 如何获得两个轮廓?这可以通过将输入图像转换为边缘图像,然后检测轮廓来实现。但在本例中,在两个对象的交点处出现了一个边缘图像中断(我尝试使用canny),如下所示 闯入Canny: 然而,预期的边缘图像应该在边界处具有白色的所有像素 预期的边缘图像: 因此,为了得到这个完美的边缘图像,我在下面创建了一个共享的algo(这个algo只适用于像这样的带有白色填充

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

例如,此图像:

将输出一个轮廓。
如何获得两个轮廓?

这可以通过将输入图像转换为边缘图像,然后检测轮廓来实现。但在本例中,在两个对象的交点处出现了一个边缘图像中断(我尝试使用canny),如下所示

闯入Canny:

然而,预期的边缘图像应该在边界处具有白色的所有像素

预期的边缘图像:

因此,为了得到这个完美的边缘图像,我在下面创建了一个共享的algo(这个algo只适用于像这样的带有白色填充对象的二值图像)

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

# 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
找到边缘图像后,获取图像中的所有轮廓:

cont, hier = cv2.findContours(edge, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
对于该图像,您将获得3个轮廓,2个用于两个对象,1个用于两个对象的组合。要消除组合的两个对象的轮廓,请使用层次信息

# I am taking only those contours which do not have a child contour.
finalContours = np.asarray([cont[i] for i in range(len(cont)) if hier[0][i][2] == -1])
“finalContours”将具有两个对象的两个轮廓

# I am taking only those contours which do not have a child contour.
finalContours = np.asarray([cont[i] for i in range(len(cont)) if hier[0][i][2] == -1])