Opencv是一种广泛使用的开源计算机视觉和机器学习库,可以实现许多图像处理和计算机视觉任务。其中,霍夫圆检测算法是Opencv中检测圆形的经典算法,常用于检测图像中的圆形物体。本文将详细探讨如何使用霍夫圆检测算法和轮廓面积筛选的方法来检测多个圆形,并提供两个示例说明。
准备工作
在使用Opencv进行圆形检测之前,需要进行以下准备工作:
-
导入Opencv库:可以使用pip安装Opencv库,或者从官方网站下载安装程序进行安装。
-
导入图像文件:使用Opencv库中的imread函数从本地文件夹中导入待检测的图像。
霍夫圆检测
- 霍夫圆检测原理
霍夫圆检测算法是一种基于数学变换的图像处理算法,其主要思想是将圆形上的每个像素点表示为在霍夫空间中的一个参数,然后通过霍夫变换来寻找在霍夫空间内的圆心和半径。最终,可根据霍夫累加器中识别出来的圆心和半径绘制圆形。
- 霍夫圆检测代码示例
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循环绘制每个检测到的圆形。
轮廓面积筛选
在某些情况下,我们并不仅仅想要通过霍夫圆检测得到所有圆形的参数,而是想要通过一些条件进行筛选,只保留那些符合特定要求的圆形。一个常用的方法就是利用轮廓的特征,比如面积。通过筛选面积在一定范围内的轮廓,可以排除一些不合适的结果。
- 轮廓面积筛选原理
轮廓是Opencv中用于表示物体形状的一组点的集合。轮廓面积是轮廓所覆盖面积的大小,通过计算其面积可以过滤掉一些不规则、不完整或太小的轮廓。使用轮廓面积进行筛选常用的方法是使用cv2.contourArea函数计算轮廓面积,并将其与预先设定的最小值和最大值进行比较。
- 轮廓面积筛选代码示例
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技术站