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

yizhihongxing

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:准备布局文件 首先,我们需要准备一个布局文件来显示选择项。可以使用RadioButton或者CheckBox来实现单项选择。以下是一个示例布局文件: <Line…

    other 2023年9月7日
    00
  • Android图表库HelloChart绘制多折线图

    Android图表库HelloChart绘制多折线图攻略 HelloChart是一个功能强大的Android图表库,可以用于绘制多种类型的图表,包括折线图。下面是绘制多折线图的完整攻略,包含两个示例说明。 步骤一:添加依赖 首先,在项目的build.gradle文件中添加以下依赖: dependencies { implementation ‘com.git…

    other 2023年9月7日
    00
  • 如何下载旧版本的mysql

    如果您需要下载旧版本的MySQL,可以按照以下步骤进行操作。以下是如何下载旧版本的MySQL的完整攻略,包含两个示例说明。 步骤一:访问MySQL官方网站 访问MySQL官方网站(https://dev.mysql.com/downloads/mysql/)。 步骤二:选择要下载的MySQL版本 在MySQL官方网站上,可以找到所有可用的MySQL版本。选择…

    other 2023年5月9日
    00
  • CDR中输入小写字母按确定变大写怎么办?

    CDR中输入小写字母按确定变大写攻略 如果你在CDR(CorelDRAW)中输入小写字母后按下确定键,字母不会自动转换为大写。然而,你可以使用以下两种方法将小写字母转换为大写: 方法一:使用文本工具和字母转换功能 打开CDR文件并选择文本工具(T)。 在画布上创建一个文本框,并输入你想要转换的小写字母。 选中文本框中的字母,然后在顶部菜单栏中找到“文本”选项…

    other 2023年8月18日
    00
  • 微信小程序数据分析之自定义分析的实现

    很高兴为您讲解“微信小程序数据分析之自定义分析的实现”的完整攻略。 概述 在进行微信小程序数据分析时,我们通常会使用第三方分析工具,如友盟、神策等。这些工具提供了丰富的数据分析功能,但有时可能不能完全满足我们的需求,这时我们就需要进行自定义分析。微信小程序提供了自定义数据分析能力,开发者可以通过发送自定义数据到指定的服务器上,然后进行自定义分析。 本攻略将会…

    other 2023年6月25日
    00
  • C/C++实现投骰子游戏

    首先,我们需要确定投骰子游戏的规则和逻辑。 投骰子游戏通常由两个及以上玩家进行,每个玩家轮流投掷骰子,将骰子点数相加计算得分,总分数高者获胜。在每次投掷后,玩家可以选择停止投掷并计算得分,也可以继续投掷骰子。如果在投掷过程中出现了骰子点数之和等于7的情况,本轮该玩家得分清零。 基于这个规则,我们可以开始进行C/C++实现投骰子游戏的编写。 定义骰子点数范围和…

    other 2023年6月26日
    00
  • HTC手机Android Phone驱动下载地址及安装教程详细介绍

    HTC手机Android Phone驱动下载地址及安装教程详细介绍 下载驱动 首先,我们需要下载HTC手机的Android Phone驱动。你可以在HTC官方网站上找到最新的驱动程序。以下是下载地址的示例: HTC官方网站 HTC驱动下载页面 在这些网站上,你可以找到适用于不同型号的HTC手机的驱动程序。选择适合你手机型号的驱动程序并下载到你的计算机上。 安…

    other 2023年8月4日
    00
  • python循环嵌套的多种使用方法解析

    Python循环嵌套的多种使用方法解析 循环嵌套是指在一个循环体内部再嵌套另一个循环体。Python中的循环嵌套可以用于处理复杂的问题,提供了更灵活的控制流程。本文将详细介绍Python循环嵌套的多种使用方法,并提供两个示例说明。 1. 嵌套循环的基本语法 Python中的嵌套循环可以使用for循环或while循环来实现。基本语法如下: for 变量1 in…

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