使用霍夫圆变换检测圆形数组
我正在尝试检测数组中的所有圆形。为此,我使用了霍夫圆变换。现在我能检测到数组中的100%圆形,但有很多错误的检测结果(假阳性)。当我去掉这些错误的检测结果时,就无法检测到100%的圆形。当我把下面代码中的dp参数改为1时,所有的错误检测结果都消失了;但如果保持为3,就会有很多错误的检测结果,同时还能检测到100%的圆形。我希望能在没有或只有很少错误检测结果的情况下,达到100%的检测率。有什么好的方法可以做到这一点呢?
import cv2
import cv2.cv as cv
import numpy as np
img = cv2.imread('test1.tiff',0)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img, cv.CV_HOUGH_GRADIENT,3,15,
param1=70 ,param2=17,minRadius=1,maxRadius=10)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
cv2.imshow('detected circles',cimg)
cv2.imwrite("output15.jpg", cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里有一张示例图片:
1 个回答
5
因为这些是圆形的,而且都是黑色的,为什么不使用一种叫做形态学的处理方法,把它们过滤掉呢?可以用一个圆盘形状的工具来处理,然后把处理后的图像和原始图像相减,这样就能得到比较好的结果。形态学处理的速度虽然不算特别快,但比另一种叫做霍夫变换的方法要快。
具体做法是,先把背景扩张(用圆盘形状的工具),直到黑色部分消失,然后再把原始图像从处理后的图像中减去。接着进行阈值处理。最后,你可以通过大小过滤,去掉那些可能会漏进来的小碎片。
考虑到这个应用场景,我觉得霍夫变换不是最好的选择,除非这是一个学校的项目。