使用霍夫圆变换检测圆阵列

use*_*616 3 python matlab opencv image-processing computer-vision

我试图检测数组中的所有圆圈.为了达到这个目的,我正在使用Hough Circle Transform.我能够在阵列中检测到100%的圆圈,但是有很多误报,当我摆脱误报时,我无法检测到100%的圆圈.当我在下面给出的代码中将dp参数更改为1时,所有的误报都消失了,当我将其保持为3时,有很多误报,100%检测.我希望100%检测到0或非常少的误报.这样做的最佳方法是什么.

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()
Run Code Online (Sandbox Code Playgroud)

这里有一个示例图片:

原始图像

没有误报 误报

Jim*_*ion 5

既然它们是圆形的,并且都是黑暗的,为什么不用形态磁盘过滤它们并从过滤后的图像中减去原始图像以获得良好的响应?形态学不是特别快,但比霍夫快.你要做的是扩大背景(用圆盘形状)直到黑色消失,然后从中减去原始图像.然后门槛.然后,您可以进行大小过滤,以消除可能通过的任何微小碎片.

鉴于这个应用,我不认为霍夫是最强的选择,除非这是一个学校项目.