首页 > 解决方案 > 如何计算重叠轮廓

问题描述

我有那些重叠的轮廓。

轮廓示例

现在我可以计算 3 个不同的轮廓,但我需要计算所有重叠的轮廓,所以总共 9 个。如何将所有轮廓彼此分开,以计算正确的数量?我使用 GaussianBlur 和 Canny 进行分割,并使用 cv2.dilate 来加强轮廓。

这里是轮廓的检测,image是加载的灰度图,segment是上面提到的分割后的图像:

(sticks, hierarchy) = cv2.findContours(segment.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnt = len(sticks)

rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB )
cv2.drawContours(rgb, sticks, -1, (255, 0, 0), 1)
print(f'Counted bad: {cnt}')

cv2.imshow('img', rgb)

标签: pythonopencvimage-segmentation

解决方案


此解决方案不是通用的,但适用于您提供的输入图像。您可以使用垂直和水平内核并侵蚀图像,从而移除水平或垂直轮廓。删除后,就像您目前所做的那样,找到轮廓并计算它们。

import cv2
import numpy as np

img = cv2.imread('overlap.jpg', 0)

kernel_h = np.ones((1, 39), dtype=np.uint8)
kernel_v = np.ones((39, 1), dtype=np.uint8)
horizontal = cv2.erode(img, kernel_h)
vertical = cv2.erode(img, kernel_v)

sticks_h, _ = cv2.findContours(horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
sticks_v, _ = cv2.findContours(vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
print('Total count is:', len(sticks_h) + len(sticks_v))

cv2.imshow('original', img)
cv2.imshow('horizontal', horizontal)
cv2.imshow('vertical', vertical)
cv2.waitKey(0)
cv2.destroyAllWindows()

水平轮廓。 水平轮廓

垂直轮廓。 垂直轮廓

对于具有两个或多个相交的水平或垂直轮廓的图像,此解决方案将失败。如果轮廓的形状没有大的高宽比或反之亦然,它也会失败。


推荐阅读