OpenCV霍夫圆变换cv2.HoughCircles()

1. 前言

OpenCV是一个强大的计算机视觉库,其中cv2.HoughCircles()函数是其中的一个函数,它可以用于在图像中检测圆。本文将介绍如何使用OpenCV的cv2.HoughCircles()函数来检测圆形,同时讲解该函数的使用方法和需要注意的事项。

2. cv2.HoughCircles()函数概述

cv2.HoughCircles()函数是OpenCV中用于检测圆形的函数,其函数原型如下:

circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius=0, maxRadius=0)

2.1 参数解释

image: 需要检测圆形的源图像,必须为单通道灰度图像。

method: 检测圆的方法,目前OpenCV仅支持霍夫梯度法(CV_HOUGH_GRADIENT)。

dp: 累加器图像分辨率与原图像分辨率的比值,dp越小,假设每个圆周围的梯度值都是相同的,那么检测到的圆就越多,否则圆检测的数量就会减少。通常情况下,dp取值为1.0。

minDist: 圆心之间的最小距离,如果距离小于此值,则认为是同一个圆,否则认为是不同的圆。

param1: Canny边缘检测中的高阈值,用于控制边缘的强度。

param2: 霍夫变换中圆心检测阈值,用于控制检测到的圆的质量。

minRadius: 圆的最小半径。

maxRadius: 圆的最大半径。

3. cv2.HoughCircles()函数调用方式

下面是使用cv2.HoughCircles()函数检测圆的一般步骤:

读入图像并转换为单通道灰度图像。

设置cv2.HoughCircles()函数需要的参数。

调用cv2.HoughCircles()函数进行圆形检测。

在图像上绘制圆形。

3.1 读入图像并转换为单通道灰度图像

首先,读入需要进行圆形检测的图像。为了使函数能够进行圆形检测,必须将图像转换为单通道灰度图像。下面是示例代码:

import numpy as np

import cv2

# 读入图像并转换为单通道灰度图像

img = cv2.imread('circle.jpg', 0)

3.2 设置cv2.HoughCircles()函数需要的参数

在调用cv2.HoughCircles()函数之前,需要设置一些参数。下面是示例代码:

# 设置参数

param1 = 50

param2 = 30

minRadius = 10

maxRadius = 100

# 调用cv2.HoughCircles()函数进行圆形检测

circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=param1, param2=param2, minRadius=minRadius, maxRadius=maxRadius)

3.3 调用cv2.HoughCircles()函数进行圆形检测

调用cv2.HoughCircles()函数进行圆形检测。下面是示例代码:

# 调用cv2.HoughCircles()函数进行圆形检测

circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=param1, param2=param2, minRadius=minRadius, maxRadius=maxRadius)

3.4 在图像上绘制圆形

最后,将检测到的圆绘制在图像上,可以使用cv2.circle()函数。下面是示例代码:

# 在图像上绘制圆形

if circles is not None:

circles = np.round(circles[0, :]).astype("int")

for (x, y, r) in circles:

cv2.circle(img, (x, y), r, (0, 255, 0), 2)

# 显示图像

cv2.imshow("circle detection", img)

cv2.waitKey(0)

4. 注意事项

注意:

cv2.HoughCircles()函数只能检测灰度图像中的圆形,如果图像是RGB彩色图像,则需要先将其转换为单通道灰度图像。

参数param1和param2对圆形检测的效果有很大的影响,需要根据实际情况进行调整。

如果检测到的圆的数量不正确或者检测到的圆的质量不好,则需要进行参数调整或增加预处理步骤。

如果需要检测不同大小或者不同颜色的圆,则需要增加预处理步骤,例如颜色分割、尺度空间分析等。

5. 结语

本文介绍了OpenCV的cv2.HoughCircles()函数的使用方法和需要注意的事项。希望能够对需要进行圆形检测的读者有所帮助。

后端开发标签