霍夫变换

关于霍夫变换(Hough transform)

霍夫变换用于检测直线

简介

霍夫变换中用下列方程式表示直线:

                                               \rho \doteq xcos\theta + ysin\theta

其中参数\rho是直线与图像原点(左上角)的距离,\theta是直线与垂直线间的角度。在这种表示法中,图像中的直线有一个0~\pi的角度

\theta,而半径\rho的最大值是图像对角线的长度。

霍夫变换用于检测直线的缺点

霍夫变换只是寻找图像中边缘像素的对齐区域,有些像素只是碰巧排成了直线,因此可能产生错误的检测结果;

可能因为多条参数相近的直线穿过了同一个像素对齐区域,而导致出现重复的结果。

普通的霍夫变换检测直线的函数:

cv::HoughLines(test, lines, 
               1              // 半径步长
               PI/180,        // 角度步长
               60);           // 最小投票数

概率霍夫变换对基本算法的修正

为了解决上述问题并检测到线段,可以利用概率霍夫变换解决。

1、概率霍夫变换在二值分布图上随机选择像素点,而不是系统性地逐行扫描图像。

2、一旦累加器的某个入口处到达了预设的最小值,就沿着对应的直线扫描图像,并移除这条直线上的所有像素点(包括还没投票的像素点)。

3、这个扫描过程还检测可以接受的线段长度。为此,算法定义两个额外的参数:一个是允许的线段最小长度,另一个是组成线段时允许的最大像素距离。

概率霍夫变换算法的复杂度增加,但可以在扫描直线的过程中清除部分像素点,减少投票过程中用到的像素点。

概率霍夫变换检测直线的函数:

CV::HoughLinesP(binary, lines,
                deltaRho, deltaTheta, minVote,
                minLength, maxGap);

霍夫变换用于检测圆

简介

圆的参数方程:

                                           r^{2}=(x-x_{0})^{2}+(y-y_{0})^{2}

这个方程中包含三个参数(圆半径和圆心坐标),这表明需要使用三维的累加器。但一般来说,累加器的维数越多,霍夫变换就越复杂,可靠性也就越低。

OpenCV中采用的策略

在用霍夫变换检测圆的实现中使用两轮筛选。

检测边缘发现可能的圆心,第一轮筛选使用一个二维累加器,找到可能的圆的位置。因为圆上像素点的梯度方向与半径方向是一致的,所以对每个像素点来说,累加器只对沿着梯度方向的入口增加计数(根据预先定义的最小和最大半径值)。

一旦检测到可能的圆心(即收到预定数量的投票),就在第二轮筛选中建立半径值范围的一维直方图。这个直方图的尖峰就是被检测圆的半径

注意点:

霍夫变换对噪声比较敏感,因此需要对图像先进行中值滤波,去除椒盐噪声。

参考书籍:

《OpenCV 计算机视觉编程攻略》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值