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

yizhihongxing

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中我们可以使用re模块来实现正则表达的相关操作。本攻略将详细讲解Python正则表达式匹配数字和小数的方法,包括如何使用正则表达式实现常见的数字和小数匹配需求。 匹配整数 下面是一个例子,演示如何使用Python正则表达式匹配整…

    python 2023年5月14日
    00
  • Python读取Word文档中的Excel嵌入文件的方法详解

    让我详细讲解一下如何通过Python读取Word文档中的Excel嵌入文件。 1. 获取Word文档中的Excel嵌入文件 首先,我们需要获取Word文档中的Excel嵌入文件。我们可以使用Python中的docx2python库来读取Word文档,然后使用olefile库来获取嵌入对象。以下是一个示例: import olefile from docx2p…

    python 2023年5月13日
    00
  • Python+SymPy实现秒解微积分详解

    下面是Python+SymPy实现秒解微积分详解的完整攻略。 1. 安装 SymPy SymPy 是 Python 下的一个符号计算库,可以用于解决微积分、代数、数论等各种数学问题。可以通过 pip 安装,命令如下: pip install sympy 2. 导入 SymPy 在 Python 中,导入 SymPy 库是很简单的,只需要使用 import 模…

    python 2023年6月5日
    00
  • python ElementTree 基本读操作示例

    当我们需要解析XML文档时,Python内置的ElementTree模块是一个非常方便的工具。以下是关于Python ElementTree模块的基本读操作示例: 导入ElementTree模块 如果你在Python 2.x中使用ElementTree模块,请使用以下代码进行导入: import xml.etree.ElementTree as ET 如果你…

    python 2023年6月3日
    00
  • Python源码解析之List

    Python中的列表(List)是一种常用的数据类型,可以存储多个元素。本文将详细讲解Python中列表的源码实现,包括列表的内部结构、列表的创建、添加元素、删除元素、修改、切片操作等,并提供两个实例说明。 列表的内部结构 Python中的列表是一种动态数组,它的内部结构由以下三个部分组成: 指向列表元素的指针数组 列表长度 列表的容量 指向列表元素的指针数…

    python 2023年5月13日
    00
  • 国产化设备鲲鹏CentOS7上源码安装Python3.7的过程详解

    下面是详细讲解“国产化设备鲲鹏CentOS7上源码安装Python3.7的过程详解”的完整攻略。 准备工作 在开始安装Python之前,需要安装一些依赖的软件。在终端输入以下命令安装: sudo yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel wge…

    python 2023年5月30日
    00
  • python实现获取客户机上指定文件并传输到服务器的方法

    下面是“python实现获取客户机上指定文件并传输到服务器的方法”的完整攻略: 1. 前置要求 在客户机上安装python环境。 确认客户机和服务器都能相互通信。 2. 实现步骤 2.1 密码认证方式 如果服务器端使用密码方式认证,则可以使用paramiko模块实现。具体代码如下: import paramiko transport = paramiko.T…

    python 2023年6月3日
    00
  • Python中的一些陷阱与技巧小结

    Python中的一些陷阱与技巧小结 Python是一种非常受欢迎的编程语言,但是在实际开发中,我们也会遇到一些陷阱和技巧。本文将介绍一些常见的陷阱和技巧,希望能够帮助大家更好的使用Python。 1. Python中的缺省值陷阱 在Python中,使用is和is not来判断两个变量是否相等时需要注意一个细节。下面的例子展示了这个问题: a = None b…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部