2014-09-06 180 views
0

我用各种OpenCV过滤器创建了黑色和白色面具。有四个圈是清晰可见black and white maskPython OpenCV从黑色和白色面具检测圈

我试图勾勒使用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

如果您提供一段可运行的代码来加载图像并绘制圆圈,有人可能会倾向于查看它。 – Bull 2014-09-06 01:47:09

+0

谢谢@B ...添加了可运行代码 – fruitcup 2014-09-06 01:52:50

回答

0

首先,如果我没有记错,Hough变换为界需要一个空心圆,不是一个完整的一个。这意味着在应用霍夫变换之前,您只需要提取圆的边界/周长。 OpenCV的findContoursarcLength函数将帮助您找到周界。

其次,不幸的是,在我的经验中,霍夫变换对圆形的变化非常敏感,这意味着如果你试图检测的形状是“几乎”一个圆,它可能无法检测到它。

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


或者,您可以尝试使用RANSAC算法检测圆。 Here是用于检测线条的实现,但您可以为圆圈进行调整 - 只需随机选择3个点(而不是2个),然后定义经过它们的圆。接下来,找出位于该圆圈附近的所有点(称为内点点)。它们将是满足不等式几点: enter image description here

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

祝你好运!