gimg = cv2.medianBlur(img, 3)
kernel = np.ones((10, 10))
gimg = cv2.cvtColor(gimg, cv2.COLOR_BGR2GRAY)
cv2.imshow('灰度图', gimg)
# ret, bimg = cv2.threshold(gimg, 200, 255, cv2.THRESH_BINARY)
edged = cv2.Canny(gimg,75,200)
cv2.imshow('edged', edged)
# edged2 = cv2.morphologyEx(edged, cv2.MORPH_OPEN, kernel)
# edged2 = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)
edged2 = cv2.dilate(edged, kernel, iterations=1)
cv2.imshow('edged2', edged2)
# 确保至少发现一个圆
circles = cv2.HoughCircles(edged2, cv2.HOUGH_GRADIENT, 1,
100, param1=100, param2=10, minRadius=5, maxRadius=100)
# circles = np.uint16(np.around(circles))
print(circles)
for i in circles[0,:]:
# draw the outer circle
cv2.circle(gimg,(i[0],i[1]),i[2],(255,255,0),2)
# draw the center of the circle
cv2.circle(gimg,(i[0],i[1]),2,(255,255,0),3, )
cv2.imshow('detected circles',gimg)
cv2.waitKey(0)
上述在检测圆之前先用了中值滤波、灰度化、canny边缘检测、膨胀运算,然后运用霍夫圆检测
膨胀运算可以改为闭运算,检测出外圆轮廓更符合实际大小。因为膨胀操作会放大白色从而侵蚀圆的范围。
但是值得注意的一点是,进行开运算会报错,暂时不知道是为什么。
使用开运算的效果如下
较小的值可以提高
检测
的精度,但可能会增加计算时间。图像预处理:在进行Hough变换之前,你可以尝试进行一些图像预处理操作,例如调整对比度、直方图均衡化、图像增强等,以提高
圆
的
检测
效果。:这两个参数用于指定允许
检测
到的
圆
的最小和最大半径。如果你知道
圆
的大致大小范围,可以设置这两个参数来限制
检测
的范围。如果你没有得到预期的结果,你可以尝试调整一些参数来优化
圆
的
检测
。图像尺寸:如果图像尺寸过大,可以考虑将图像缩小到适当的尺寸,以加快计算速度。可以过滤掉较弱的
圆
。你可以尝试不同的值来找到适合你图像的阈值。
有了ROI
圆
心和半径信息之后,我们就可以通过
Python
OpenCV
提供的函数提取ROI所在的图像区域。在图像上单击鼠标左键,就可以选择ROI
圆
心位置,拖动鼠标则可选择ROI的半径大小。通过与用户的交互,我们能够方便地确定ROI
圆
心和半径信息,并将其用于后续的操作。在实现
圆
形ROI区域选取之前,我们需要先确定所需的ROI
圆
心位置和半径大小。以上代码将打开文件test.jpg,并从该图像中提取以(ix,iy)为
圆
心、半径为radius的ROI区域,并显示提取结果。
本文主要论述在图像处理的的基础上,为了克服图像背景中的亮度噪声、背景复杂和一些角度问题,通过图像预处理之后,利用边缘
检测
算法从而实现对图像边缘的识别,再利用利用牛顿迭代法,通过不断地迭代,与目标值进行迭代,从而达到实现
检测
圆
的目标,以及
圆
心所在的位置。
霍夫
圆
检测
是先进行
圆
心的确定,然后根据
圆
心推导出半径。1。
圆
心
检测
的原理:
圆
心是无数条直线相交的结果,那么可以设定一个阈值,如果相交于一点的直线超过了阈值,那么就可以将该点确定为
圆
心。2.确定了
圆
心,那么
圆
上的点到
圆
心的距离是固定的,即为半径,设定阈值,如果有很多点到
圆
心的距离超过了阈值,那么该距离就设定为半径3.知道了半径和
圆
心,那么就获取到了整个
圆
的方程,就可以进行
圆
的
检测
和绘制了。img=待处理图像cv.HOUGH_GRADIENT=霍夫变换使用的算法。