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

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 可以与摄像机一起使用,实时地捕获并处理每一帧。巧妙使用本方法,可以实现很多实时的图像识别应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python OpenCV基于霍夫圈变换算法检测图像中的圆形 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 详解Python实现图像分割增强的两种方法

    当前主流的图像分割方法有很多,而 Python 作为一种功能强大的编程语言,也为图像分割提供了便捷的工具。本文将介绍两种 Python 实现图像分割增强的方法。 方法一:基于 OpenCV 实现 OpenCV 是一个计算机视觉库,具有强大的图像处理和分析功能。使用 Python 和 OpenCV 实现图像分割可以分为以下几个步骤: 加载图像:使用 OpenC…

    python 2023年6月3日
    00
  • 如何使用Python在MySQL中使用游标?

    当使用Python与MySQL交互时,可以使用游标来执行SQL语句并处理结果。游标是一种用于在MySQL中检索和操作数据的机制。以下是使用Python在MySQL中使用游标的完整攻略,包括创建游标、使用游标和删除游标等步骤。同时,还提供了两个示例来演示如何在Python中使用MySQL游标。 创建游标 在Python中使用MySQL游标之前,需要先创建游标。…

    python 2023年5月12日
    00
  • 解决python2.7 查询mysql时出现中文乱码

    解决Python2.7查询MySQL时出现中文乱码的完整攻略 在Python2.7中,当我们查询MySQL数据库中的中文数据时,可能会出现中文乱码的问题。本攻略将介绍如何解决Python2.7查询MySQL时出现中文乱码的问题。 1. 设置MySQL编码 在Python2.7中,我们可以使用以下代码设置MySQL编码: import MySQLdb # 连接…

    python 2023年5月15日
    00
  • 详解Python 运用过滤器

    当我们处理一些数据时,常常需要对数据进行筛选、转换等操作,这时候Python的过滤器就能派上大用场。Python中的过滤器是指使用某个函数过滤一个序列,只保留符合条件的元素,它通常与lambda表达式一起使用。 Python过滤器的基本用法 在Python中,过滤器的基本用法是使用filter函数。filter函数需要传入两个参数:一个是函数,一个是序列。将…

    python-answer 2023年3月25日
    00
  • python实现腾讯滑块验证码识别

    Python实现腾讯滑块验证码识别攻略 简介 腾讯滑块验证码是指腾讯开放平台等业务的验证码形式之一,通常包含一个滑块拼图和一个背景图片。用户需要将滑块拼图拖到背景图片上的合适位置才能通过验证。 这种验证码具有识别难度较高、对自动化攻击具有较好的防御效果等特点,但也给用户带来了一定的使用体验上的负担。因此鉴于实际需要,人们将研究出了多种方法来自动识别或破解该类…

    python 2023年6月3日
    00
  • 表格梳理解析python内置时间模块看完就懂

    表格梳理解析Python内置时间模块看完就懂 介绍 Python内置的时间模块datetime提供了处理日期和时间的函数和类,可以帮助我们方便地进行时间计算和转换。本文将详细讲解datetime模块的各个函数和类的用法,以及示例说明,让读者能够轻松理解和使用。 datetime类 datetime是datetime模块最常用的类,表示一个日期和时间的对象。类…

    python 2023年6月6日
    00
  • 基于python实现简单网页服务器代码实例

    下面是我详细讲解”基于python实现简单网页服务器代码实例”的完整攻略。 什么是简单网页服务器 简单网页服务器是指可以在本机上运行的程序,通过监听本机的HTTP请求,可以将请求到达的URL对应的网页文件发送给客户端浏览器,在客户端浏览器渲染显示页面。 实现一个简单网页服务器 1. 第一步安装flask库 flask 是一个Python工具箱,用于Web应用…

    python 2023年5月19日
    00
  • 在Python中使用NumPy对0轴上的Legendre系列进行积分

    首先,我们需要安装并导入NumPy库,其在Python中的安装命令如下: !pip install numpy 安装完毕后,我们可以通过以下代码导入NumPy库: import numpy as np 接下来,我们将介绍如何在Python中使用NumPy对0轴上的Legendre系列进行积分的完整攻略。 1. 将函数转换为Legendre系数 首先,我们将需…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部