我使用各种OpenCV滤镜创建了一个黑白掩模。有四个圆圈清晰可见
我正在尝试使用HoughCircles概述这些圈子,但它会产生许多误报并且通常会产生错误结果:
circles = cv2.HoughCircles(combined, cv.CV_HOUGH_GRADIENT, 1, 300, np.array([]), 10, 30, 60, 300)
如何正确检测黑白图像中的圆形?
这是可以与黑白图像一起使用的可运行代码:
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()
答案 0 :(得分:1)
首先,如果我没有弄错的话,Hough Transform for circle需要一个空心圆,而不是一个完整圆。这意味着在应用Hough变换之前,您只需要提取圆的边界/周长。 OpenCV的findContours
和arcLength
函数可以帮助您找到周界。
其次,不幸的是,根据我的经验,霍夫变换对圆形的变化非常敏感,这意味着如果你想要检测的形状几乎是"几乎"一个圆圈,它可能无法检测到它。
我的建议是你应该尝试制作你的物品"圆形"通过在二进制映像上应用Closing morphological operation,使用磁盘形结构元素。然后提取图像中对象的周长,然后才应用Hough变换。希望这会给你足够好的结果。
或者,您可以尝试使用RANSAC算法检测圈子。 Here是用于检测线条的实现,但您可以针对圆圈进行调整 - 只需随机选择3个点(而不是2个),并定义一个贯穿它们的圆圈。接下来,找到靠近该圆圈的所有点(这些点称为内点)。这些将是满足不平等的要点:
其中(x,y)
为点,(x0,y0)
是圆的中心,r
是其半径,margin
是您必须参加的参数调。
算法的其余部分是相同的。