我已将Otsu的二值化应用于一张图像并获得了结果
在那之后,我使用此代码来获取围绕四个主要形状的框:
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一起用于下一个操作。这里出了什么问题?
答案 0 :(得分:1)
按照OpenCV轮廓documentation:
在OpenCV中,找到轮廓就像从黑色中找到白色物体 背景。因此请记住,要找到的对象应该是白色的 背景应该是黑色的。
但是在您的情况下,这显然是与要求相反的,因此您只需要反转图像即可,只需执行以下操作即可:
img = cv2.bitwise_not(img)
另外,请注意:
为获得更高的准确性,请使用二进制图像。所以在找到轮廓之前 应用阈值或Canny边缘检测。
反转图像后,我使用了您的图像并获得了以下结果。如果要删除小盒子,只需使用cv2.threshold
即可获取二进制图像。