如果我给你一张这样的图:
告诉你这张图里面有一条看起来挺直的线,让你指出来线在哪、线的指向是向哪个方向。你肯定可以不假思索地告诉我线的位置和方向。
但是对于计算机来说这并不是一件简单的事情,因为图片在计算机中的存储形式就是【0001101111001010110101…..】,根本没有办法从这个序列中直接给出是否有直线以及直线的位置。
霍夫变换,就是一个可以让电脑自己学会找直线的算法。
我们来具体看看霍夫变换为什么可以让电脑学会自己找直线。
在一张图中(以刚才那张图为例),我们先建个坐标系:正交直角坐标系, 以图片的左上角作为起始点,以像素作为标度。
建立的坐标系就像下面这张图一样:
在这样一张图中,一条线段所在的直线可以被描述成一个一次函数: y=k x + b。而找图中的直线的基本思想就是把这张图转化到一个类似(k,b)的空间中去,其中遇到一个问题就是:如果所处理的线中有竖直的线,那么就会遇到非常大的k,这个会在数值上造成一些麻烦。
所以实际上是采用Hesse仿射坐标系——
这样的坐标系:
把xy空间转化到了距离角度表示的空间。
在这样的变换中,原图像上的点
对应变换后空间中的一条曲线:
如果原图上有两个点,如图所示:
那么它们对应的曲线就会经过同一点,这个点就是原图中的直线的原点距和角方向所对应的参数点,这条直线上的所有点所描出的曲线都会经过这个点。在霍夫变换后的仿射参数空间,这个点就会被点亮。我们可以通过寻找霍夫变换后的参数空间上的亮点来确定原空间上的直线的位置的方向。
讲一个简单的例子来理解这个过程 :
首先这样一张图上有一些亮点,为了区分它们,我用不同的颜色分别代表不同位置的点。
我们可以看到这张图上的绿色紫色蓝色红色的点看起来像是一条直线上的点,现在我们对于这幅图来进行霍夫变换,也就是分别对这些带入霍夫变换公式:
结果在仿射参数空间的结果是这个样子的:
原图上红色紫色绿色蓝色的点对应的变换曲线相交在同一个点上,这个点对应的原点距和角方向就是原图中的四个点所在的直线的方向:
所以理论上,霍夫变换就是对于原图上的每一个直线都在参数空间画一条线,最终找出参数空间变换线比较密集的地方在对应回到xy 空间,就是直线的位置和方向了。听起来还算简单