【问题标题】:How to count overlapping contours如何计算重叠轮廓
【发布时间】:2021-08-01 19:25:25
【问题描述】:

我有那些重叠的轮廓。

现在我可以计算 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)

【问题讨论】:

    标签: python opencv image-segmentation


    【解决方案1】:

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

    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()
    

    水平轮廓。

    垂直轮廓。

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

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多