OpenCV-Otsu二进制化后RETR_EXTERNAL不起作用

时间:2018-09-26 07:58:48

标签: python opencv opencv-contour

我已将Otsu的二值化应用于一张图像并获得了结果

enter image description here

在那之后,我使用此代码来获取围绕四个主要形状的框:

img = cv.imread('test_bin.jpg', 0)
_, cnts, _ = cv.findContours(img.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)

for cnt in cnts:
    x,y,w,h = cv.boundingRect(cnt)
    cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

cv.imwrite('test_cnt.jpg', img)

但是,我什么也没得到。它只返回一个轮廓,我想它可能是完整的图像本身。我看到它适用于RETR_TREE,但是我需要它与RETR_EXTERNAL一起用于下一个操作。这里出了什么问题?

1 个答案:

答案 0 :(得分:1)

按照OpenCV轮廓documentation

  

在OpenCV中,找到轮廓就像从黑色中找到白色物体   背景。因此请记住,要找到的对象应该是白色的   背景应该是黑色的。

但是在您的情况下,这显然是与要求相反的,因此您只需要反转图像即可,只需执行以下操作即可:

img = cv2.bitwise_not(img)

另外,请注意:

  

为获得更高的准确性,请使用二进制图像。所以在找到轮廓之前   应用阈值或Canny边缘检测。

反转图像后,我使用了您的图像并获得了以下结果。如果要删除小盒子,只需使用cv2.threshold即可获取二进制图像。

enter image description here