霍夫变换检测直线
原理:
(x,y)坐标空间的直线,等价于(m,b)坐标空间的一点,等价于(r,θ)坐标空间的一点;
(x,y)坐标空间的一点,等价于(m,b)坐标空间的一条直线,等价于(r,θ)坐标空间的一条正弦线
注: 转换为r-θ坐标空间,是因为b-m空间在检测垂直线条m->∞和参数的非线性离散化时会遇到困难。
霍夫变换检测圆
原理
(x-a)^2 + (y-b)^2 = r^2
-
(a-x)^2 + (b-y)^2 = r^2
原理同样是转换到参数空间,(x,y)坐标系中经过圆上的一点(
与检测直线的区别:
hough检测直线,在hough空间是正弦线的交点;而检测圆,hough空间是圆的交点;
霍夫变换任意可用方程表示的曲线
对于可以用解析方程描述的曲线,使用hough变换检测曲线的算法描述为:
霍夫变换检测任意形状:广义霍夫变换
原理
用一个例子解释原理:
考虑在一个边缘图像中检测一个已知半径的圆,因为圆是旋转对称的,因此只需考虑平移情况。如果希望在边缘图像中尽可能迅速地找到圆的位置,对于比背景亮的圆,它的边缘梯度向量方向垂直圆边界并指向圆中心,如果圆比背景暗,梯度方向背离圆心。由于我们已知圆的半径,理论上我们可以从圆上单个点确定圆的中心。不幸的是,我们不知道哪个点在圆上。我们注意到圆上所有的像素都拥有同样的特性,这个特性就是基于梯度向量可以构建出圆的中心,这样我们就可以找到圆的位置。
我们可以用以下步骤完成已知半径圆检测(得到中心坐标):
1. 创建一个数组累积圆心出现在某个位置的次数,数组初始化为0;
2. 遍历所有边缘点位置、该点的梯度向量以及已知半径求出一个潜在的圆心位置;
3. 将累计数组对应位置的数组值加一
4. 遍历完所有边缘点后,累积数组中将包含所寻找圆心坐标的投票,设定一个阈值可得到圆中心位置;
上述算法运算时间与目标图像边缘点数量成比例,与模板大小无关,与圆的大小无关(只是遍历目标图像边缘点,利用是模板的先验信息)。
扩展到检测任意形状:
- 任意物体边界上的梯度向量不是必然指向一个参考点;那我们可以建立边缘点信息(梯度方向)与参考点位置(r向量)间的关系表,此表成为R-table;
- 在检测过程中,我们对于给定边缘点信息,我们通过查表然后计算出参考点位置,然后根据投票机制,确定投票最多的位置。
- r向量指参考点到边界点的向量,向量包括大小(r)和方向(α);因此关系表表示为梯度方向的函数;即φ-r(φ)-α(φ);
由于形状不规则,可能存在每个φ对应多个r向量。
边缘点与参考点之间的计算关系:
实现方法
R表建立详细步骤为:
检测过程:
对于旋转尺度变换的检测:
优缺点
优点:
- 对噪声不敏感
- 容忍轻微变形
缺陷:
- 需要大量的存储空间
- 对于机器视觉应用还不够快,用来搜索对象的累积空间会在很短的时间内变得非常大,但是内部是可以并行的!
- 速度的改进方向有:金字塔加速,减少累积数组的尺寸!
参考资料:
- Generalized Hough Transform(GHT) Ballard and Brown, section 4.3.4
- 机器视觉算法与应用
- http://www.aiseminar.cn/bbs/forum.php?mod=viewthread&tid=1479
- 图像处理、分析与机器视觉(第三版)