文章目录
- 1、功能描述
- 2、代码实现
- 3、效果展示
- 4、完整代码
- 5、涉及到的库函数
- 6、参考
更多有趣的代码示例,可参考【Programming】
1、功能描述
2、代码实现
载入必要的库
python">import sys
import cv2 as cv
import numpy as np
函数入口
python">if __name__ == "__main__":main(sys.argv[1:])
读取图片,判断图片读取是否成功
python"> default_file = '1.jpg'filename = argv[0] if len(argv) > 0 else default_file# Loads an imagesrc = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)# Check if image is loaded fineif src is None:print('Error opening image!')print('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')return -1
输入图片转成灰度图
python"> gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)cv.imwrite("gray.jpg", gray)
灰度图片进行平滑滤波
python"> gray = cv.medianBlur(gray, 5)cv.imwrite("medianBlur.jpg", gray)
配置好算法需要的参数
python"> rows = gray.shape[0]print(rows)
output
python">202
调用圆形检测算法
python"> circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=100, param2=30,minRadius=30, maxRadius=100)
根据预测的结果绘制出来圆形,包含圆心和圆
python"> if circles is not None:circles = np.uint16(np.around(circles))for i in circles[0, :]:center = (i[0], i[1])# circle centercv.circle(src, center, 1, (0, 100, 100), 3)# circle outlineradius = i[2]cv.circle(src, center, radius, (255, 0, 255), 3)
保存结果,可视化结果,退出窗口,退出主函数
python"> cv.imwrite("circles.jpg", src)cv.imshow("detected circles", src)cv.waitKey(0)return 0
3、效果展示
python"> circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=150, param2=30,minRadius=70, maxRadius=200)
输入图片
平滑后
检测结果
python"> circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=150, param2=50,minRadius=25, maxRadius=100)
输入图片
平滑后
结果
python"> circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=70, param2=30,minRadius=20, maxRadius=100)
输入图片
灰度图平滑
检测结果
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=70, param2=45,minRadius=110, maxRadius=200)
输入图片
灰度平滑后
检测结果
python"> circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=70, param2=40,minRadius=20, maxRadius=100)
输入图片
灰度平滑后
检测结果
python"> circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=70, param2=40,minRadius=20, maxRadius=70)
输入图片
灰度平滑后
检测结果
python"> circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=100, param2=35,minRadius=20, maxRadius=70)
输入图片
灰度滤波后
检测结果
4、完整代码
python">import sys
import cv2 as cv
import numpy as npdef main(argv):default_file = '1.jpg'filename = argv[0] if len(argv) > 0 else default_file# Loads an imagesrc = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)# Check if image is loaded fineif src is None:print('Error opening image!')print('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')return -1gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)cv.imwrite("gray.jpg", gray)gray = cv.medianBlur(gray, 5)cv.imwrite("medianBlur.jpg", gray)rows = gray.shape[0]print(rows)circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=100, param2=30,minRadius=30, maxRadius=100)if circles is not None:circles = np.uint16(np.around(circles))for i in circles[0, :]:center = (i[0], i[1])# circle centercv.circle(src, center, 1, (0, 100, 100), 3)# circle outlineradius = i[2]cv.circle(src, center, radius, (255, 0, 255), 3)cv.imwrite("circles.jpg", src)cv.imshow("detected circles", src)cv.waitKey(0)return 0if __name__ == "__main__":main(sys.argv[1:])
5、涉及到的库函数
cv2.HoughCircles
是 OpenCV 库中的一个函数,用于在图像中检测圆形的存在。它基于霍夫变换的圆检测算法,可以在给定的图像中检测并返回所有检测到的圆的信息,如圆的中心坐标和半径。
python">circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius)
-
image:输入的单通道灰度图像。函数将在该图像中进行圆检测。
-
method:霍夫变换的检测方法。常用的有
cv2.HOUGH_GRADIENT
和cv2.HOUGH_GRADIENT_ALT
。cv2.HOUGH_GRADIENT_ALT
是cv2.HOUGH_GRADIENT
的改进方法。 -
dp:图像分辨率与累加器分辨率的比值。例如,dp=1时,累加器和输入图像有相同的分辨率;dp=2时,累加器是输入图像一半大的宽高。
-
minDist:检测到的圆的中心之间的最小距离。如果设置得太小,可能会检测到多个相邻的圆;如果设置得太大,可能会漏掉一些圆。
-
param1:Canny边缘检测的高阈值。对于
cv2.HOUGH_GRADIENT
和cv2.HOUGH_GRADIENT_ALT
,这是 Canny 边缘检测的高阈值,低阈值是该参数的一半。 -
param2:累加器阈值。对于
cv2.HOUGH_GRADIENT
,它表示检测阶段圆心的累加器阈值,值越小,检测出的圆越多;对于cv2.HOUGH_GRADIENT_ALT
,它表示圆形的“完美性”度量,值越接近1,算法选择的圆形形状越好。 -
minRadius:需要检测的最小圆半径。
-
maxRadius:需要检测的最大圆半径。如果设置为<=0,则使用最大图像尺寸;如果<0,且 method=
cv2.HOUGH_GRADIENT
时,用来查找圆心而忽略半径的查找,method=cv2.HOUGH_GRADIENT_ALT
不受影响,始终会去找半径。
返回值
- circles:返回的圆形的点,是一个三维数组。对于
HOUGH_GRADIENT
和HOUGH_GRADIENT_ALT
两种方法,返回的圆形数组形式有差异。通常,返回的数组中包含了检测到的圆的中心坐标和半径。
注意事项
- 输入图像的质量对函数的检测效果有很大的影响,通常需要进行适当的预处理,如平滑、边缘检测等。
- 参数的选择对检测的结果有重要的影响,需要根据具体的应用场景进行调整和优化。
- 函数返回的圆的信息需要进一步处理和分析,以满足实际应用的需求。
应用场景
cv2.HoughCircles
函数在很多领域都有重要的应用,如医学影像分析、工业机器视觉、自动驾驶等。例如,在医学影像分析中,常常需要检测和分析图像中的各种病变和器官,如肿瘤、血管等。使用cv2.HoughCircles
函数,可以有效地在医学影像中检测出各种形状的病变,为医生的诊断和治疗提供重要的参考依据。
6、参考
更多有趣的代码示例,可参考【Programming】