为了账号安全,请及时绑定邮箱和手机立即绑定

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

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



  • 其转换的参数方程如下:

    webp

  • 对于圆来说,θ的取值范围在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<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();
}



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

webp

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

上述三个指定参数如何影响霍夫圆检测的计算量
  1. 指定半径范围:
    minRadius:检测的最小圆半径,单位为像素。
    maxRadius:检测的最大圆半径,单位为像素。
    即函数只检测半径处于minRadius和maxRadius之间的圆,所以指定半径范围自然能够影响计算量了。

  2. 指定边缘阈值
    霍夫圆检测的基于内部边缘检测的结果;
    而边缘阈值影响边缘检测最终留下的边缘像素,即影响内部边缘检测的结果,
    因而影响霍夫圆检测的计算量;

  3. 累积器阈值
    此阈值的高低便是提取圆的要求的高低,高阈值高要求高计算量,反之亦然。

  • 此外广义霍夫变换通过拓展,可以实现任意形状的检测,可以查阅其他相关的资料了解,这里便不多说了。



作者:凌川江雪
链接:https://www.jianshu.com/p/6a2ef6a4f4d1


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消