原创: @Pjer 石头科普工作室 2018.10.22

如果我给你一张这样的图:

告诉你这张图里面有一条看起来挺直的线,让你指出来线在哪、线的指向是向哪个方向。你肯定可以不假思索地告诉我线的位置和方向。

但是对于计算机来说这并不是一件简单的事情,因为图片在计算机中的存储形式就是【0001101111001010110101…..】,根本没有办法从这个序列中直接给出是否有直线以及直线的位置。

霍夫变换,就是一个可以让电脑自己学会找直线的演算法。

我们来具体看看霍夫变换为什么可以让电脑学会自己找直线。

在一张图中(以刚才那张图为例),我们先建个坐标系:正交直角坐标系, 以图片的左上角作为起始点,以像素作为标度。建立的坐标系就像下面这张图一样:

在这样一张图中,一条线段所在的直线可以被描述成一个一次函数: y=k x + b。而找图中的直线的基本思想就是把这张图转化到一个类似(k,b)的空间中去,其中遇到一个问题就是:如果所处理的线中有竖直的线,那么就会遇到非常大的k,这个会在数值上造成一些麻烦。所以实际上是采用Hesse仿射坐标系——

这样的坐标系:

把 x y 空间转化到了距离角度表示的空间。在这样的变换中,原图像上的点

对应变换后空间中的一条曲线:

如果原图上有两个点,如图所示:

那么它们对应的曲线就会经过同一点,这个点就是原图中的直线的原点距角方向所对应的参数点,这条直线上的所有点所描出的曲线都会经过这个点。在霍夫变换后的仿射参数空间,这个点就会被点亮。我们可以通过寻找霍夫变换后的参数空间上的亮点来确定原空间上的直线的位置的方向。

讲一个简单的例子来理解这个过程 :

首先这样一张图上有一些亮点,为了区分它们,我用不同的颜色分别代表不同位置的点。

我们可以看到这张图上的绿色紫色蓝色红色的点看起来像是一条直线上的点,现在我们对于这幅图来进行霍夫变换,也就是分别对这些带入霍夫变换公式:

结果在仿射参数空间的结果是这个样子的:

原图上红色紫色绿色蓝色的点对应的变换曲线相交在同一个点上,这个点对应的原点距和角方向就是原图中的四个点所在的直线的方向

所以理论上,霍夫变换就是对于原图上的每一个直线都在参数空间画一条线,最终找出参数空间变换线比较密集的地方在对应回到xy 空间,就是直线的位置和方向了。听起来还算简单,我们看一个实际的例子。

例子是这样的,还是上面那张图。

对就是那个只有一条线的图。

对于这样一张图,我们把它变换到参数空间:

参数空间中最亮的位置被标记了出来,它的位置给出圆心距是42 方向角是55。我们回到原图上去。就是我们直线所在的位置:

至此,我们就找到了直线。

霍夫变换这个概念虽然在1962年就被提出来了,后于1972年由Richard Duda和Peter Hart推广使用,但是当时计算机还非常落后,要知道到1980年前后个人计算机才开始普及,所以当时的应用并不广泛。在今天,人工智慧飞速发展,特征提取的需求越来越大,人工的对于数据进行标记所耗费的时间和精力太大,霍夫变换这种可以在复杂场景中提取特征的演算法就有了非常广泛的应用。后续我们将会介绍这种特征提取演算法在空间物理中解决实际问题的案例,敬请期待!

Dr.Stone

石头科普工作室出品

撰稿: @Pjer

美编:渡鸦

欢迎转发至朋友圈,转载请注明出处

投稿邮箱:[email protected]

推荐阅读:

相关文章