Python OpenCV从黑白掩码中检测圆圈

时间:2014-09-06 01:31:54

标签: python opencv computer-vision edge-detection

我使用各种OpenCV滤镜创建了一个黑白掩模。有四个圆圈清晰可见black and white mask

我正在尝试使用HoughCircles概述这些圈子,但它会产生许多误报并且通常会产生错误结果:

circles = cv2.HoughCircles(combined, cv.CV_HOUGH_GRADIENT, 1, 300, np.array([]), 10, 30, 60, 300)

circle outlines

如何正确检测黑白图像中的圆形?

这是可以与黑白图像一起使用的可运行代码:

import numpy as np
import cv2
import cv

image = cv2.imread("image.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

circles = cv2.HoughCircles(gray, cv.CV_HOUGH_GRADIENT, 1, 300, np.array([]), 10, 30, 60, 300)
if circles is not None:
  circles = np.uint16(np.around(circles))
  for i in circles[0,:]:
      cv2.circle(image, (i[0], i[1]), i[2], (0, 255, 0), 1)
      cv2.circle(image, (i[0], i[1]), 2, (0, 0, 255), 3)

cv2.imshow("thing", image)

cv2.waitKey(0)
cv2.destroyAllWindows()

1 个答案:

答案 0 :(得分:1)

首先,如果我没有弄错的话,Hough Transform for circle需要一个空心圆,而不是一个完整圆。这意味着在应用Hough变换之前,您只需要提取圆的边界/周长。 OpenCV的findContoursarcLength函数可以帮助您找到周界。

其次,不幸的是,根据我的经验,霍夫变换对圆形的变化非常敏感,这意味着如果你想要检测的形状几乎是"几乎"一个圆圈,它可能无法检测到它。

我的建议是你应该尝试制作你的物品"圆形"通过在二进制映像上应用Closing morphological operation,使用磁盘形结构元素。然后提取图像中对象的周长,然后才应用Hough变换。希望这会给你足够好的结果。


或者,您可以尝试使用RANSAC算法检测圈子。 Here是用于检测线条的实现,但您可以针对圆圈进行调整 - 只需随机选择3个点(而不是2个),并定义一个贯穿它们的圆圈。接下来,找到靠近该圆圈的所有点(这些点称为内点)。这些将是满足不平等的要点: enter image description here

其中(x,y)为点,(x0,y0)是圆的中心,r是其半径,margin是您必须参加的参数调。 算法的其余部分是相同的。

祝你好运!