轮廓检测未检测到另一个对象内的对象

时间:2018-08-16 10:47:54

标签: opencv contour

我正在尝试检测此图像上的轮廓数量。理想情况下应该为3,但由于噪音,我没有得到空闲的结果。因此,我尝试在将图像阈值化之前对图像进行模糊处理:

import numpy as np
import cv2
img= cv2.imread('Inkedblueimagewithdot.jpg')
cv2.imshow('original',img)
blur= cv2.pyrMeanShiftFiltering(img,21,49)
gray_image= cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
ret,thresh= cv2.threshold(gray_image,70,255,cv2.THRESH_BINARY)
_, contours,hierarchy =cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
print(len(contours))
contourimage=cv2.drawContours(img,contours,-1,(255,255,255),20)
cv2.imshow('countors',contourimage)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出为:

2

这是输入图像: This is the input image

这是输出图像:This is the output image

1 个答案:

答案 0 :(得分:0)

为了获得3个轮廓,可以使用cv2.RETR_LIST。它列出了二进制图像中存在的所有轮廓,与here

中提到的任何层次结构无关

要回答第二个问题,您可以尝试设置区域约束,以便丢弃特定区域以下的轮廓。对于提供的图像,我将区域设置为4000:

for i, c in enumerate(contours):
    if cv2.contourArea(c) > 4000:
        x, y, w, h = cv2.boundingRect(c)
        roi = image[y  :y + h, x : x + w ]

        cv2.imshow('cropped_region', roi)
        cv2.waitKey(0)

预期结果:

enter image description here