android opencv 霍夫,计算机视觉 OpenCV Android | 基本特征检测之 霍夫圆检测

霍夫圆变换与霍夫直线变换的原理类似,也是将圆上的每个点转换到霍夫空间,

其转换的参数方程如下:

AAffA0nNPuCLAAAAAElFTkSuQmCC对于圆来说,θ的取值范围在0~360°,这样就有了三个参数,

另外两个参数是圆心(x0,y0)与半径γ。

这里的霍夫空间便是一个三维空间,

所以如果还是跟之前的累积计算一样,计算量就会大大增加,

这样显然不利于快速计算与检测,

所以在OpenCV中,

霍夫圆检测不是基于二值图像或者边缘检测的结果,

而是基于灰度图像的梯度来找到候选区域,

然后基于候选区域实现霍夫圆检测,

这样就会大大减少计算量,提高程序的执行速度与性能,

但是基于梯度实现霍夫圆检测也带来了另外一个问题,那就是结果特别容易受到噪声影响,

对图像中的噪声特别敏感,

所以在OpenCV中使用相关API实现霍夫圆检测的时候,

首先需要通过模糊操作对图像进行噪声抑制处理。

一般来说,常见的均值、高斯、中值模糊对图像噪声的抑制已经比较有效,

但是在霍夫圆检测中有时候还会用到边缘保留滤波来抑制平坦区域噪声,

以便在进行梯度计算的时候能够更好地得到候选区域。

霍夫圆检测的API:HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius)

image:8位单通道的灰度图像。

circles:输出的三个向量的数组,圆心与半径(x,y,r)。

method:唯一支持的方法就是基于梯度霍夫变换——HOUGH_GRADIENT。

dp:图像分辨率,注意dp越大,图像就会相应减小分辨率;当dp等于1时,其跟原图的大小一致;当dp=2时,其为原图的一半。

minDist:表示区分两个圆的圆心之间最小的距离,如果两个圆之间的距离小于给定的minDist,则认为是同一个圆,这个参数对霍夫圆检测来说非常有用,可以帮助降低噪声影响。

param1:边缘检测Canny算法中使用的高阈值。

param2:累加器阈值,值越大,说明越有可能是圆。

minRadius:检测的最小圆半径,单位为像素。

maxRadius:检测的最大圆半径,单位为像素。

使用API实现灰度图像圆检测:private void houghCircleDemo(Mat src, Mat dst) {

Mat gray = new Mat();

Imgproc.pyrMeanShiftFiltering(src, gray, 15, 80);

Imgproc.cvtColor(gray, gray, Imgproc.COLOR_BGR2GRAY);

Imgproc.GaussianBlur(gray, gray, new Size(3, 3), 0);

// detect circles  Mat circles = new Mat();

dst.create(src.size(), src.type());

Imgproc.HoughCircles(gray, circles, Imgproc.HOUGH_GRADIENT, 1, 20, 100, 30, 10, 200);

for(int i=0; i

float[] info = new float[3];

circles.get(0, i, info);

Imgproc.circle(dst, new Point((int)info[0], (int)info[1]), (int)info[2],

new Scalar(0, 255, 0), 2, 8, 0);

}

circles.release();

gray.release();

}

运行结果如下图,左侧为原图,右侧是霍夫圆检测运行结果:

AAffA0nNPuCLAAAAAElFTkSuQmCC霍夫圆检测相比霍夫直线检测,计算量大,输出参数多,

因此一般都通过指定半径范围,指定边缘阈值与累积器阈值来减少计算量,

否则速度就会很慢,这个也是在使用的时候需要特别注意的。上述三个指定参数如何影响霍夫圆检测的计算量指定半径范围:

minRadius:检测的最小圆半径,单位为像素。

maxRadius:检测的最大圆半径,单位为像素。

即函数只检测半径处于minRadius和maxRadius之间的圆,所以指定半径范围自然能够影响计算量了。

指定边缘阈值

霍夫圆检测的基于内部边缘检测的结果;

而边缘阈值影响边缘检测最终留下的边缘像素,即影响内部边缘检测的结果,

因而影响霍夫圆检测的计算量;

累积器阈值

此阈值的高低便是提取圆的要求的高低,高阈值高要求高计算量,反之亦然。此外广义霍夫变换通过拓展,可以实现任意形状的检测,可以查阅其他相关的资料了解,这里便不多说了。

作者:凌川江雪

链接:https://www.jianshu.com/p/6a2ef6a4f4d1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
霍夫圆检测是一种用于检测图像中圆形的算法。在OpenCV中,霍夫圆检测是基于图像梯度的实现。具体原理如下: 1. 首先,对图像进行中值滤波,以减少噪声的影响\[1\]。 2. 接下来,通过检测边缘来发现可能的圆心。这一步使用图像梯度的方法来计算边缘\[1\]。 3. 在第一步的基础上,从候选圆心开始计算最佳半径大小。这一步使用霍夫变换的方法来确定圆的半径\[1\]。 在OpenCV中,可以使用cv::HoughCircles函数来实现霍夫圆检测。该函数的参数包括输入图像、输出结果、方法、尺度因子、最短距离、Canny边缘检测的低阈值、中心点累加器阈值、最小半径和最大半径\[3\]。 总结来说,霍夫圆检测通过对图像进行中值滤波和边缘检测,然后使用霍夫变换来确定圆的位置和半径。这种方法可以有效地检测图像中的圆形物体。 #### 引用[.reference_title] - *1* [OpenCvSharp 学习笔记21-- 霍夫变换 - 圆检测 (Hough Circle transform)](https://blog.csdn.net/weixin_41049188/article/details/92422241)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [OpenCV 霍夫圆检测](https://blog.csdn.net/qq_44989881/article/details/116135750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [OpenCV20---霍夫圆检测](https://blog.csdn.net/qq_45646174/article/details/105086711)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值