关于霍夫变换(Hough transform)
霍夫变换用于检测直线
简介
霍夫变换中用下列方程式表示直线:
其中参数是直线与图像原点(左上角)的距离,是直线与垂直线间的角度。在这种表示法中,图像中的直线有一个0~的角度
,而半径的最大值是图像对角线的长度。
霍夫变换用于检测直线的缺点
霍夫变换只是寻找图像中边缘像素的对齐区域,有些像素只是碰巧排成了直线,因此可能产生错误的检测结果;
可能因为多条参数相近的直线穿过了同一个像素对齐区域,而导致出现重复的结果。
普通的霍夫变换检测直线的函数:
cv::HoughLines(test, lines,
1 // 半径步长
PI/180, // 角度步长
60); // 最小投票数
概率霍夫变换对基本算法的修正
为了解决上述问题并检测到线段,可以利用概率霍夫变换解决。
1、概率霍夫变换在二值分布图上随机选择像素点,而不是系统性地逐行扫描图像。
2、一旦累加器的某个入口处到达了预设的最小值,就沿着对应的直线扫描图像,并移除这条直线上的所有像素点(包括还没投票的像素点)。
3、这个扫描过程还检测可以接受的线段长度。为此,算法定义两个额外的参数:一个是允许的线段最小长度,另一个是组成线段时允许的最大像素距离。
概率霍夫变换算法的复杂度增加,但可以在扫描直线的过程中清除部分像素点,减少投票过程中用到的像素点。
概率霍夫变换检测直线的函数:
CV::HoughLinesP(binary, lines,
deltaRho, deltaTheta, minVote,
minLength, maxGap);
霍夫变换用于检测圆
简介
圆的参数方程:
这个方程中包含三个参数(圆半径和圆心坐标),这表明需要使用三维的累加器。但一般来说,累加器的维数越多,霍夫变换就越复杂,可靠性也就越低。
OpenCV中采用的策略
在用霍夫变换检测圆的实现中使用两轮筛选。
检测边缘发现可能的圆心,第一轮筛选使用一个二维累加器,找到可能的圆的位置。因为圆上像素点的梯度方向与半径方向是一致的,所以对每个像素点来说,累加器只对沿着梯度方向的入口增加计数(根据预先定义的最小和最大半径值)。
一旦检测到可能的圆心(即收到预定数量的投票),就在第二轮筛选中建立半径值范围的一维直方图。这个直方图的尖峰就是被检测圆的半径
注意点:
霍夫变换对噪声比较敏感,因此需要对图像先进行中值滤波,去除椒盐噪声。
参考书籍:
《OpenCV 计算机视觉编程攻略》