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=霍夫变换使用的算法。