python - 如何计算重叠轮廓
问题描述
我有那些重叠的轮廓。
现在我可以计算 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)
解决方案
此解决方案不是通用的,但适用于您提供的输入图像。您可以使用垂直和水平内核并侵蚀图像,从而移除水平或垂直轮廓。删除后,就像您目前所做的那样,找到轮廓并计算它们。
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()
对于具有两个或多个相交的水平或垂直轮廓的图像,此解决方案将失败。如果轮廓的形状没有大的高宽比或反之亦然,它也会失败。
推荐阅读
- javascript - 如何在 Javascript 中的 Map 键上使用 .map()
- php - 使用 file_get_contents() 的 API 调用返回 503 服务暂时不可用,但在浏览器中返回正常
- c++ - 如何迭代 std::variant 的类型?
- html - 如何在html表单的输入文本字段中显示响应数据?
- arrays - 使用声明从bash中的数组引用变量
- javascript - 如何在客户端 ES6 JavaScript 中卸载和垃圾收集模块?
- javascript - 即使调用了函数也不会触发
- java - 逆向工程 JDBC Oracle 连接字符串
- docker - 无法在安装了 redis 的 docker 容器中使用 redis-cli
- makefile - make: SECONDEXPANSION 的范围