前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >计算机视觉 OpenCV Android | 基本特征检测之 霍夫圆检测

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

作者头像
凌川江雪
发布2019-03-04 16:46:32
1.4K0
发布2019-03-04 16:46:32
举报
文章被收录于专栏:李蔚蓬的专栏李蔚蓬的专栏
  • 霍夫圆变换霍夫直线变换原理类似,也是将圆上的每个点转换到霍夫空间
  • 其转换的参数方程如下:
  • 对于圆来说,θ的取值范围在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实现灰度图像圆检测:

代码语言:javascript
复制
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<circles.cols(); 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();
}

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

  • 霍夫圆检测相比霍夫直线检测计算量大,输出参数多, 因此一般都通过指定半径范围指定边缘阈值累积器阈值减少计算量, 否则速度就会很慢,这个也是在使用的时候需要特别注意的。

上述三个指定参数如何影响霍夫圆检测的计算量

  1. 指定半径范围: minRadius:检测的最小圆半径,单位为像素。 maxRadius:检测的最大圆半径,单位为像素。 即函数只检测半径处于minRadius和maxRadius之间的圆,所以指定半径范围自然能够影响计算量了。
  2. 指定边缘阈值 霍夫圆检测的基于内部边缘检测的结果; 而边缘阈值影响边缘检测最终留下的边缘像素,即影响内部边缘检测的结果, 因而影响霍夫圆检测的计算量;
  3. 累积器阈值 此阈值的高低便是提取圆的要求的高低,高阈值高要求高计算量,反之亦然。
  • 此外广义霍夫变换通过拓展,可以实现任意形状的检测,可以查阅其他相关的资料了解,这里便不多说了。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.02.05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档