Python OpenCV基于霍夫圈变换算法检测图像中的圆形

2023-12-16Python编程
106

Python OpenCV基于霍夫圈变换算法检测图像中的圆形

基本介绍

霍夫圆变换是利用数学原理检测图像中的圆形的一种方法。它需要对每个像素点进行检测,计算出其是否可以代表一个圆。这种方法在处理较小的圆或噪声较小的图像时非常有效。

算法步骤

霍夫圆变换算法的具体步骤如下:

  1. 边缘检测:使用Canny算法或其他方法根据图像进行边缘检测。
  2. 霍夫变换:对于边缘图像中的每个非零像素点进行处理,生成一系列可能的圆心和半径。
  3. 圆形检测:对于每组可能的圆心和半径,计算其中多少个包含足够的边缘点(该点是通过设置阈值来确定的),如果该值超过了一个预定义的阈值,那么就可以说这个圆形是有效的。

OpenCV的实现

OpenCV 中可以通过调用 cv2.HoughCircles() 函数来实现霍夫圆变换算法的检测。这个函数有一些参数需要设置,如下所示:

cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])

参数说明:

  • image:8位单通道灰度输入图像
  • method:定义检测图像中的圆的方法。目前支持 CV_HOUGH_GRADIENT 标准霍夫变换方法和 CV_HOUGH_GRADIENT_ALT 一种改进型方法。
  • dp:累加器分辨率与图像分辨率的反比。它对应于霍夫空间中一组累加器的图像大小。
  • minDist:检测到的圆心之间的最小距离。
  • circles:定义输出的二维向量。向量的每个元素都包含圆的参数(3个浮点数):圆的中心坐标 (x,y) 和半径 r。
  • param1:用于处理边缘检测的阈值。
  • param2:用于检测圆度的阈值。如果阈值过高,则可能会忽略某些圆形。如果阈值过低,则可能会将其他对象误判为圆形。
  • minRadius:最小半径。
  • maxRadius:最大半径。

下面是关于 OpenCV 霍夫圆变换的两个示例:

示例1

import cv2
import numpy as np

img = cv2.imread('test.jpg', 0)
img = cv2.medianBlur(img, 5)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20,
                           param1=50, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
    # draw the outer circle
    cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)
    # draw the center of the circle
    cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)
cv2.imshow('detected circles', cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上代码从文件中读取了图像,并将它转为了灰度图像,然后应用了中值滤波器以消除噪声。接下来,通过将图像传递给 cv2.HoughCircles() 函数,使用标准的 CV_HOUGH_GRADIENT 霍夫变换方法来检测图像中的圆形。最终,使用 cv2.circle() 函数将检测出的圆形绘制在彩色输出图像中。

示例2

import cv2
import numpy as np

cap = cv2.VideoCapture(0)
while True:
    # Capture frame-by-frame
    ret, frame = cap.read()
    # Convert to gray
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # Apply Gaussian Blur
    gray_blur = cv2.GaussianBlur(gray, (25, 25), 0)
    # Detect Circles
    circles = cv2.HoughCircles(gray_blur, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
    # If circles are detected, convert the (x, y) coordinates and radius of the circles to integers
    if circles is not None:
        circles = np.round(circles[0, :]).astype("int")
        # Loop over the (x, y) coordinates and radius of the circles
        for (x, y, r) in circles:
            # Draw the circle in the output frame
            cv2.circle(frame, (x, y), r, (0, 255, 0), 2)
    # Display the resulting frame
    cv2.imshow('Circle Detection', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

以上代码从摄像机捕获了连续的帧。在每个帧上,从 BGR 色彩空间转换为灰度图像,并应用了高斯模糊器以消除噪声。接下来,应用霍夫圆变换检测图像中的圆。最终,使用 cv2.circle() 函数将检测出的圆形绘制在上述的帧上。

总结

使用 OpenCV 的霍夫圆变换功能可以非常轻松地检测图像中的圆形。此外,OpenCV 可以与摄像机一起使用,实时地捕获并处理每一帧。巧妙使用本方法,可以实现很多实时的图像识别应用。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103