Hough Transform 霍夫变换检测直线
从理论到代码,再从代码到理论
(1)理论之通俗理解:
1.在图像中检测直线的问题,其实质是找到构成直线的所有的像素点。那么问题就是从找到直线,变成找到符合y=mx+c的所有(x,y)的点的问题。
2.进行坐标系变化y=mx+c,变成c=-xm+b。直线上的点(x1,y1),在转换坐标系后为一条直线。这个原理应该是高中的。
3.直线上每一个点在MC坐标系中都表现为直线,而且,这些直线都相交于一个点,(m,c)。找到所有点的问题,转变为寻找直线的问题。
4.对于图像中的每一个点,在MC坐标系中对应着很多的直线。找到直线的交点,就对应着找到图像中的直线。
实际在使用这一原理的时候,不是采用直线的斜率和截距公式,而是用
如何实现:
1. 将θ角在-90度到90度的范围里,划分为很多区间,对所有的像素点(x,y)在所有θ角的时候,求出ρ.从而累加ρ值出现的次数。高于某个阈值的ρ就是一个直线。
2. 这个过程就类似于如下一个二维的表格,横坐标就是θ角,ρ就是到直线的最短距离。
横坐标θ不断变换,对于所有的不为0的像素点,计算出ρ,找到ρ在坐标(θ,ρ)的位置累加1.
3. 上图中局部最大的就是找到的直线的θ和ρ的值。
图像处理之霍夫变换(直线检测算法)
霍夫变换是图像变换中的经典手段之一,主要用来从图像中分离出具有某种相同特征的几何
形状(如,直线,圆等)。霍夫变换寻找直线与圆的方法相比与其它方法可以更好的减少噪
声干扰。经典的霍夫变换常用来检测直线,圆,椭圆等。
霍夫变换算法思想:
以直线检测为例,每个像素坐标点经过变换都变成都直线特质有贡献的统一度量,一个简单
的例子如下:一条直线在图像中是一系列离散点的集合,通过一个直线的离散极坐标公式,
可以表达出直线的离散点几何等式如下:
X *cos(theta) + y * sin(theta) = r 其中角度theta指r与X轴之间的夹角,r为到直线几何垂
直距离。任何在直线上点,x, y都可以表达,其中 r, theta是常量。该公式图形表示如下:
然而在实现的图像处理领域,图像的像素坐标P(x, y)是已知的,而r, theta则是我们要寻找
的变量。如果我们能绘制每个(r, theta)值根据像素点坐标P(x, y)值的话,那么就从图像笛卡
尔坐标系统转换到极坐标霍夫空间系统,这种从点到曲线的变换称为直线的霍夫变换。变换
通过量化霍夫参数空间为有限个值间隔等分或者累加格子。当霍夫变换算法开始,每个像素
坐标点P(x, y)被转换到(r, theta)的曲线点上面,累加到对应的格子数据点,当一个波峰出现
时候,说明有直线存在。同样的原理,我们可以用来检测圆,只是对于圆的参数方程变为如
下等式:
(x –a ) ^2 + (y-b) ^ 2 = r^2其中(a, b)为圆的中心点坐标,r圆的半径。这样霍夫的参数空间就
变成一个三维参数空间。给定圆半径转为二维霍夫参数空间,变换相对简单,也比较常用。
编程思路解析:
1. 读取一幅带处理二值图像,最好背景为黑色。
2. 取得源像素数据
3. 根据直线的霍夫变换公式完成霍夫变换,预览霍夫空间结果
4. 寻找最大霍夫值,设置阈值,反变换到图像RGB值空间(程序难点之一)
5. 越界处理,显示霍夫变换处理以后的图像