一 霍夫直线变换
1 点斜式
直线方程可表示为:y = kx + b, 当k, b确定时,在xy平面上确定一条唯一直线;考虑同样的变形 b = -xk + y,当x, y确定时,可以看做在kb平面上确定的一条唯一直线;若x, y表示xy平面上一个已知坐标点,则经过该坐标点(x, y)可形成多条直线, 其表达式为:b = -xk + y。
考虑在平面图像上存在一条有效直线段,遍历图像上每一个点,并计算出每个点可能形成的直线参数;发现某个特定参数(k, b)出现次数最多,这个特定参数应该为图像上有效直线段的参数(k, b)。
通过以上观察,可以将参数(k, b)离散化,然后遍历平面图像上的每一个点,累加可能形成直线(k, b)参数;当遍历完整个图像后,在累加器(k, b)中会产生一个全局最大值,该值为平面图像上有效直线的参数(k, b)。
当平面图像上存在多条有效直线段时,在累加器(k, b)中会产生多个局部极大值,可以通过设定合理的阈值以检测出平面图像上的多条直线段。
2 极坐标
使用点斜式检测直线存在两个问题:
1)y = kx + b 无法表达平行于y轴的直线段(k为无穷大);
2)k, b取值都趋近于无穷大,离散化(k, b)后参数空间趋近无穷大,计算机存储空间有限;
通过坐标转换,将直角坐标转换为极坐标可以解决以上问题。
根据图形可得:ab = 0 (向量a与向量b正交)
=>, 其中(x, y)为直线L上的任意点;
=>, 其中(x, y)为直线L上的任意点;
考虑在平面图像上存在一条有效直线段,离散化参数,然后遍历平面图像上每一个点,累加可能形成的直线
参数;类似的,在
平面上会产生一个全局最大值,该值即为平面图像上的有效直线参数
;同理,针对平面图像上存在多条有效直线段情况,可以通过局部极大值检测多条有效直线段。
二 霍夫圆变换
圆的方程式可表达为:,参数
确定一个圆;
离散化参数,遍历平面图像上每一个点,累加可能形成的圆
参数, 在
参数空间中寻找全局最大值或局部极大值以检测有效圆;
圆的方程也可表达为:,
,参数
确定一个圆;
固定,遍历平面图像上每一个点,根据公式
,
累加
参数空间,在参数空间
寻找全局最大值或局部极大值以检测半径为
的有效圆;
多次遍历平面图像,并选择不同的半径可以检测平面图像上任意半径的圆。
三 霍夫变换检测椭圆
平面上任意一个椭圆均可以看做单位圆经过缩放,旋转,平移操作形成,设在单位圆上的坐标点,经过缩放,旋转,平移变换的表达式为:
,其中单位圆表达式为:
,
=>,
,
表达式构成参数空间,离散化该参数空间, 遍历平面图像上每一个点,累加可能形成椭圆的参数,在
参数空间中寻找全局最大值或局部极大值检测椭圆。
四 广义霍夫变换
对于非解析图形,可以使用广义霍夫变换(Generalized Hough Transform)寻找目标中心位置,具体思路如下:
1)对已知形状,首先选择参考点(一般为图形重心点);
2)计算图形边缘点上的梯度方向,将边缘方向离散化为:
3)将边缘点与参考点之间的关系表示为: ,或等效表示为:
,如下图:
4)将边缘点所在边缘方向离散化,并根据离散化后边缘方向索引填充R-table,如下图:
5)如果被检测图形没有旋转与缩放,可以直接使用上表在 空间上寻找最值点。但一般情况下,被检测图形总会存在旋转与缩放,故需要对R-table进行更多处理,具体如下:
考虑对 所表示的线段做任意旋转与缩放有:
,其中
为旋转角度,s 为缩放比例;
边缘点(上)旋转缩放后的中心点为:
;
另外,当图形旋转 后,原边缘点(
上)的边缘方向也旋转
,故需要在
行上增加相应的
值;遍历所有旋转及缩放,填充R-table表以实现旋转缩放收缩。
6)在新图像中搜索边缘点,并根据边缘方向查找R-table表,对表中每一个 项应用公式:
,得到
位置;
7)在 中寻找极大值作为检测到图形中心。