基于python使用OpenCV实现在一张图片中检测出圆形,并且根据圆检测结果信息,绘制 标记出圆的边界和圆心。
1 HoughCircles 霍夫圆检测函数
在Opencv中使用HoughCircles函数可以实现圆的检测,具体函数参数如下:
- image: 输入图像,8位灰度单通道图像
- method: 检测圆的方法,目前OpenCV中有HOUGH_GRADIENT和HOUGH_GRADIENT_ALT两种方法。
- dp: 检测圆心的累加器图像的分辨率与输入图像之比的倒数,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器输入图像便有输入图像一半那么大的宽度和高度。减少图像的分辨率(宽高变小)是为了减少计算量,一般默认为1就好,保持原有图像精度。
- minDist: 检测到的两个圆心之间的最小距离。如果参数太小,除了真实的一个圆圈之外,可能错误地检测到多个相邻的圆圈。如果太大,可能会遗漏一些圆圈。
- circles: 检测到的圆的信息输出向量(x,y,r),分别代表检测到圆的中心坐标和圆半径。
- param1: Canny 边缘检测的高阈值,低阈值被自动置为高阈值的一半,默认为 100。也就是说检测图像中像素点的值大于param1是会检测为边缘。
- param2: 表示在检测阶段圆心的累加器阈值。它越小的话,会误检测到更多根本不存在的小圆,而越大,能通过检测的圆就更加接近完美的圆形了。
- minRadius: 表示图像中能检测到最小圆的半径的值。
- maxRadius: 表示图像中检测到的圆的最大半径的值。
参数设置总结
- param2值的设置根据要检测图像中圆的大小进行设置,minRadius最小圆半径和maxRadius最大圆半径可以辅助我们更好选择圆,如果没有特殊需要就都默认为0。minDist可以帮助我们筛选掉检测相近的圆。
- 霍夫圆检测的原理:第一步通过Canny边缘检测算法检测边缘,发现可能的圆心,然后再计算边缘像素点到圆心的距离估计圆的半径。
2 HoughCircles 霍夫圆检测代码实现
实现霍夫圆检测的实现代码非常简单,首先使用cv2.cvtColor函数将要检测的图像转换为灰度图像,然后调用cv2.HoughCircles霍夫圆检测函数进行检测,检测返回所有圆的中心坐标和半径信息向量circles(x,y,r)。
注意: 霍夫圆检测对噪声比较敏感,所以进行霍夫圆检测的之前可以先进行中值滤波cv2.medianBlur。
def circle_detect(image):
# 灰度化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 输出图像大小,方便根据图像大小调节minRadius和maxRadius
print(image.shape)
# 进行中值滤波
img = cv2.medianBlur(gray, 5)
# 霍夫变换圆检测
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 50, param1=100, param2=30, minRadius=5, maxRadius=100)
for circle in circles[0]:
# 圆的基本信息
print(circle[2])
# 坐标行列-圆心坐标
x = int(circle[0])
y = int(circle[1])
# 半径
r = int(circle[2])
# 在原图用指定颜色标记出圆的边界
cv2.circle(image, (x, y), r, (0, 0, 255), 3)
# 画出圆的圆心
cv2.circle(image, (x, y),5, (0, 255, 0), -1)
cv2.imshow("image",image)
img = cv2.imread(r'D:\yolov5-5.0\data\images\1.jpg')
circle_detect(image=img)
cv2.waitKey(0)
最后再借助OpenCV中的画圆函数cv2.circle,cv2.circle函数参数具体如下:
- img: 要在其上绘制圆的输入图像
- center: 绘制圆的中心坐标(x,y),未设置shift参数时,默认为整数int类型。
- radius: 绘制圆的半径,未设置shift参数时,默认为整数int类型
- color: 绘制圆的边界线的颜色,OpenCV读取图像后,图像格式为BGR,即【0,255,255】表示用红色绘制圆的边缘。
- thickness: 圆的边界线的粗细像素值。值为负(-1)时绘制实心圆。
- lineType: 可选参数,线的类型:虚线、实线
- shift: 可选参数,圆心坐标点和半径值的小数点位数。
3 检测效果
通过合理的控制minDist、minRadius、maxRadius、param2这四个参数的值