Opencv检测多个圆形(霍夫圆检测,轮廓面积筛选)

Opencv是一种广泛使用的开源计算机视觉和机器学习库,可以实现许多图像处理和计算机视觉任务。其中,霍夫圆检测算法是Opencv中检测圆形的经典算法,常用于检测图像中的圆形物体。本文将详细探讨如何使用霍夫圆检测算法和轮廓面积筛选的方法来检测多个圆形,并提供两个示例说明。

准备工作

在使用Opencv进行圆形检测之前,需要进行以下准备工作:

  1. 导入Opencv库:可以使用pip安装Opencv库,或者从官方网站下载安装程序进行安装。

  2. 导入图像文件:使用Opencv库中的imread函数从本地文件夹中导入待检测的图像。

霍夫圆检测

  1. 霍夫圆检测原理

霍夫圆检测算法是一种基于数学变换的图像处理算法,其主要思想是将圆形上的每个像素点表示为在霍夫空间中的一个参数,然后通过霍夫变换来寻找在霍夫空间内的圆心和半径。最终,可根据霍夫累加器中识别出来的圆心和半径绘制圆形。

  1. 霍夫圆检测代码示例
import cv2

# 导入图像
img = cv2.imread("circle.jpg", 0)

# 霍夫圆检测
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20,
                           param1=50, param2=30, minRadius=0, maxRadius=0)

# 绘制圆形
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("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

这段代码首先导入被检测的图像(在本例中,文件名为“circle.jpg”)。然后,将图像传入cv2.HoughCircles函数中进行霍夫圆检测。在这个例子中,具体参数的含义如下:

  • img:输入图像
  • cv2.HOUGH_GRADIENT:霍夫变换类型,使用梯度法
  • 1:霍夫空间的分辨率
  • 20:两个圆心之间的最小距离
  • param1:Canny边缘检测的高阈值
  • param2:霍夫变换阈值,低于此阈值的候选圆形将被丢弃
  • minRadius:最小半径
  • maxRadius:最大半径

cv2.HoughCircles函数会返回一个由检测到的所有圆形的参数组成的数组。因此,我们需要使用np.round函数和astype方法将参数转换为整数,并使用for循环绘制每个检测到的圆形。

轮廓面积筛选

在某些情况下,我们并不仅仅想要通过霍夫圆检测得到所有圆形的参数,而是想要通过一些条件进行筛选,只保留那些符合特定要求的圆形。一个常用的方法就是利用轮廓的特征,比如面积。通过筛选面积在一定范围内的轮廓,可以排除一些不合适的结果。

  1. 轮廓面积筛选原理

轮廓是Opencv中用于表示物体形状的一组点的集合。轮廓面积是轮廓所覆盖面积的大小,通过计算其面积可以过滤掉一些不规则、不完整或太小的轮廓。使用轮廓面积进行筛选常用的方法是使用cv2.contourArea函数计算轮廓面积,并将其与预先设定的最小值和最大值进行比较。

  1. 轮廓面积筛选代码示例
import cv2
import numpy as np

# 导入图像
img = cv2.imread('fruit.jpg', 0)
img = cv2.medianBlur(img, 5)

# 阈值化
ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 轮廓面积筛选
for i in range(len(contours)):
    area = cv2.contourArea(contours[i])
    if area > 100 and area < 500:
        cv2.drawContours(img, contours, i, (0, 255, 0), 2)

# 显示结果
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

这段代码首先导入图像,并使用cv2.medianBlur函数进行中值模糊处理。然后,使用cv2.threshold函数进行阈值化,并使用cv2.findContours函数查找轮廓。在这个例子中:

  • thresh:二值化的图像
  • contours:所有轮廓的集合
  • hierarchy:轮廓间的关系

最后使用for循环对每个轮廓进行面积筛选。在这个例子中,我们将用cv2.drawContours方法将面积在100到500之间的轮廓标记为绿色。

总结

通过本文的阐述,我们了解到了使用Opencv进行圆形检测的基本原理和方法,以及使用轮廓面积筛选进行筛选的常用方法。这些技术对于图像处理和计算机视觉领域的研究和应用都具有重要的意义。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Opencv检测多个圆形(霍夫圆检测,轮廓面积筛选) - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Android 自定义组件卫星菜单的实现

    请听我讲解「Android 自定义组件卫星菜单的实现」的完整攻略。 简介 卫星菜单是一种圆形的菜单,在主菜单的周围分布着若干个子菜单图标,点击主菜单,子菜单就会从圆形菜单中弹出显示,用户可以点击子菜单图标进行操作。本攻略旨在教你如何使用 Android 自定义组件实现一个卫星菜单。 实现步骤 1. 创建项目和布局文件 首先创建一个 Android 项目,然后…

    other 2023年6月25日
    00
  • zip格式压缩文件辅助类(ZipHelper)

    Zip格式压缩文件辅助类(ZipHelper) ZipHelper是一个用于处理zip格式压缩文件的辅助类。它可以用于创建、读取和解压缩zip格式文件,并提供了一些方便的方法来操作zip格式文件。 安装 你可以使用npm来安装ZipHelper: npm install ziphelper –save ZipHelper也可以直接下载到本地使用。 创建一个…

    其他 2023年3月28日
    00
  • Linux中如何查看已挂载的文件系统类型详解

    当Linux系统中挂载了多个设备时,我们需要查看这些设备所挂载的文件系统类型,这时可以使用以下命令进行查看: mount -t type 其中,type是文件系统的类型,可以是FAT、NTFS、ext4等等。如果没有指定type,则会列出所有已经挂载的文件系统类型。 例如,如果我们想要查看所有已经挂载的ext4类型的文件系统,可以使用以下命令: mount …

    other 2023年6月27日
    00
  • Shell eval通过变量获取环境变量的方法实现

    本文将详细讲解如何使用 Shell 编程语言中的 eval 命令,通过变量的方式获取系统中的环境变量的方法实现。 1. Shell 中获取环境变量的方法 在 Shell 编程中,我们可以通过 $ 符号来获取系统中的环境变量。例如: echo $HOME 这个命令会输出系统中当前用户的 home 目录路径。 但是,在编写 Shell 脚本时,我们可能需要动态获…

    other 2023年6月27日
    00
  • 讲解vue-router之什么是嵌套路由

    讲解vue-router之什么是嵌套路由 在Vue.js中,Vue Router是一个官方的路由管理器,用于实现单页面应用程序(SPA)的导航功能。嵌套路由是Vue Router提供的一种功能,它允许我们在一个路由下定义子路由,从而实现更复杂的页面结构和导航。 嵌套路由的概念 嵌套路由是指在一个父级路由下定义子级路由的一种方式。父级路由可以包含多个子级路由,…

    other 2023年7月27日
    00
  • TestLink工具使用手册介绍

    TestLink工具使用手册介绍 简介 TestLink是一个免费开源的测试管理工具,支持测试计划、测试用例、测试执行、缺陷跟踪以及测试报告等功能。它是一个基于Web的应用程序,可以通过浏览器访问,支持多语言,可以方便地在团队之间共享测试相关工作。 本文旨在介绍TestLink工具的使用手册,帮助读者更快速地了解和使用TestLink。 安装与配置 Test…

    其他 2023年3月28日
    00
  • 使用wireshark分析tls

    使用Wireshark分析TLS TLS(Transport Layer Security)是一种加密通信协议,用于保护互联网上的数据传输安全。在这篇文章中,我们将介绍如何使用Wireshark分析TLS通信,并了解有关TLS协议的更多信息。 确保TLS数据包捕获 在使用Wireshark分析TLS通信之前,我们需要确保我们已经捕获了TLS数据包。您可以使用…

    其他 2023年3月29日
    00
  • linux shell 自定义函数方法(定义、返回值、变量作用域)

    当然!下面是关于\”Linux Shell自定义函数方法(定义、返回值、变量作用域)\”的完整攻略,包含两个示例说明。 … … … … … 示例1:定义函数 function greet() { echo \"Hello, World!\" } greet 在上面的示例中,我们定义了一个名为greet的函数,它会输出\…

    other 2023年8月20日
    00
合作推广
合作推广
分享本页
返回顶部