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