使用白色背景检测图像中的轮廓

时间:2018-04-19 15:10:02

标签: python image opencv

我在检测此图像中的轮廓时遇到问题

类图图像

我想检测图中的所有边框轮廓,但到目前为止我的程序只检测图像边框,如此图所示

忽略中心的0,表示它是轮廓0。

我注意到问题出在我的代码中,因为它可以检测黑色背景图像中的轮廓。

filename = sys.argv[1]
t = int(sys.argv[2])
img = cv2.imread(filename)

resized = imutils.resize(img, width=300)
ratio = img.shape[0] / float(resized.shape[0])

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
(t, binary) = cv2.threshold(blur, t, 255, cv2.THRESH_BINARY)

_ ,cnts, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for (i,c) in enumerate(cnts):
    M = cv2.moments(c)
    if M["m00"] != 0:
        cX = int(M["m10"] / M["m00"])
        cY = int(M["m01"] / M["m00"])
    else:
        cX, cY = 0, 0
    (x,y,w,h) = cv2.boundingRect(c)
    area = cv2.contourArea(c)
    cv2.rectangle(img, (x, y), (x + w, y + h),(0, 255, 255), 2)
    print("Object %d has dimensions x=%d, y=%d, w=%d, h=%d area=%d" % (i,x,y,w,h,int(w*h)))
    cv2.putText(img, str(i), (cX, cY),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)

2 个答案:

答案 0 :(得分:0)

  

我注意到问题出在我的代码中,因为它可以检测黑色背景图像中的轮廓。

这几乎肯定是你的问题。来自OpenCV tutorial

  

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

This SO Q/A向您展示如何反转您的图片。

正如所讨论的here

,您肯定需要在黑色上检测白色

答案 1 :(得分:0)

如果您不想反转图像,可以改用cv2.THRESH_BINARY_INV。

(t, binary) = cv2.threshold(blur, t, 255, cv2.THRESH_BINARY_INV)