Hough 变换原理与应用
前言: 详细介绍了 Hough 变换的基本思想、基本原理和应用等。其中大多都是自己的理解,难免有偏差,仅供参考。
文章目录
1. 基本概述
1.1 一些基本问题
Hough 变换简单概括就是原空间到参数空间的变换。
以一条直线为例,常用直线方程为 y = k x + b y = kx+b y=kx+b ,这个是原空间。在这个直线方程里,x 和 y 是变量,k和b为直线方程参数。注意参数不是固定的,数量也不是固定的,比如这个直线不一定非要用 k,b (斜率和截距)这两个参数,下面会有举例说明。
何为到参数空间的变换呢?
直接了当地说就是,把参数当作变量(即坐标轴)。上面直线例子而言,就是把 k,b 当作横纵坐标构建的空间。注意,这一变换并非坐标系的变换(如:不是笛卡尔坐标向极坐标的变换;两者本质就不一样),Hough变换是始终以笛卡尔坐标系为基础,只是换了坐标轴(新空间中,坐标轴换成了原空间表达式中的参数,也是因此新空间叫参数空间。)
为何要变换到参数空间呢?
原空间中一些事物具有很强的关联性,但在原空间不好观察和把握,因此考虑从别的视角来表述它们关联性。参数空间就是一种,还有类似的傅里叶变换等等。所以,可以说,我们变换此空间,是为了更直观地揪出原坐标系下一系列点间的共同特点(或者说联系)。至于为什么选择参数空间,别问,问就是第一个想出这点的数学家的智慧和创新。并且,”很巧”的是,它在处理一些问题上确实很管用。
既然说参数选择不是固定的,如何选择最佳参数来构成参数空间?
这个不用操心,针对一些特定任务和问题,前人已经给出了答案了。
1.2 以例子说明
下面以三个例子说明上述自己理解得出的重点。
1.2.1 例子1:直线 y = k x + b y = kx + b y=kx+b 到参数空间的变换(k,b为定值,如k=2,b=4)
事实上,使用这样例子并不好,容易给人带来误解,但又不得不从该例子说起。之所以说容易带来误解,原因在于:
我们遇到的问题,往往都是考察原坐标系下所给出的一系列点的关系问题。即基于点,去将这些点变换到参数空间;这个例子的表述,恰恰与此过程相反,该例子表述是已知结果(这些点是在一条直线上),去说明参数变换这回事。
两个是因果倒置的问题。这么说有些难以理解,下面例子会说明上面两句话要表达的含义。
我们考察直线到其参数空间的变换,这里参数就选择 k,b,变换如下图(a)(b)所示。
我们这样表述:左侧原空间下,对于直线 y = k x + b y = kx + b y=kx+b ,将 k , b k,b k,b 当作坐标轴的话,得到右侧参数空间,**该直线就对应于右侧空间一点 ( k , b ) (k,b) (k,b) ** 。这样表述有些别扭,因为常规上,我们都是把问题落脚在点上,毕竟计算机存储和处理的都是离散点数据。
因此修改说: 左侧原空间下,直线 y = k x + b y=kx+b y=kx+b 上的点 对应 右侧参数空间中一点 ( k , b ) (k, b) (k,b),如图©到(b)所示。 但这样说的话,同样别扭,因为这句话是错的。
Hough 变换不是常规的映射,不是点对点的对应关系,不是函数式的 f(x)。这点也可以说明它跟坐标系间变换有本质区别。
左侧原空间上的任意一点如 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),对应到右侧,不会是一个点,事实上是一条线。因为右侧表示的是直线的斜率和截距,而经过点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 的直线有无数条,也就对应着无数的 k 和 b。那是否意味着左侧这 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 点,对应到右侧,就是充满坐标轴的所有点?当然不是,因为 k,b 虽然是随机的,取值可以 [ − ∞ , ∞ ] [-\infty, \infty] [−∞,∞],但它俩不是各自随机,两者是有关系的。因为我们前面前提是经过 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 点的直线,即
y = k ( x − x 0 ) + y 0 y = k (x-x_0) + y_0 y=k(x−x0)+y0
说明:用这个 y = kx + b 这个式子不好,因为后面例子都是把 x、y 放到一侧,两者式子下,过点限制条件是由差别的。使用 y − k x = b y-kx = b y−kx=b或 y − k x − b = 0 y-kx-b=0 y−kx−b=0 理解更好,这样的话,限制条件就是
y − k x = y 0 − k x 0 或 y − k x − b = y 0 − k x 0 − b y - k x= y_0-k x_0\ \ \ \ 或 \ \ \ y-kx-b = y_0-kx_0 -b y−kx=y0−kx0 或 y−kx−b=y0−kx0−b
也即
y − k x = ( y 0 − k x ) y - kx = (y_0-kx) y−kx=(y0−kx)
这里会衍生出一个问题,即好像一个参数 k 就可以确定这一直线了。到这节最后会说到这个问题。先忽略之,或自己加以理解。
依据上式,也就是以 k, y 0 − k x 0 y_0-kx_0 y0−kx0 为参数,即 k 当横轴, y 0 − k x 0 y_0-kx_0 y0−kx0 当纵轴,或者写为我们更常见的
b = − k x 0 + y 0 b = -kx_0+y_0 b=−kx0+y0
其中,b为纵轴,k为横轴。整个过程如下图(a)(b)所示
反过来,参数空间一点,就对应于原空间里 斜率为 k,截距为 b 的直线。
总结一下,这两个空间的关系可以这样表述:左侧原空间的直线对应右侧参数空间一点;左侧原空间一点对应右侧空间一条直线。这是比较有意思的相互关系,圆形变换其实也有这个特点。参数即变量,变量即参数 的感觉。
基于此,我们就把刚才别扭的表述,说得准确些:对于左侧直线,我们用斜率 k 和截距 b 就可以描述它,并且唯一确定它,因此若建立一个斜率、截距空间,点(k,b)就可以表征一条原空间下斜率为 k 截距为 b 的直线。
那么是不是参数只能选择 k,b 呢?显然不是,比如你就可以选择 参数空间里横坐标为 k+b, 纵坐标为 b,同等效果。但一般,参数选择要为计算、理解方便服务。
假设,我们发挥了自己的想象,采取了如下两个参数,即圆心到直线的距离 d 和 这个垂线的角度 θ \theta θ,如下图所示。首先,我们明确的是,这两个参数是否可以唯一确定地表示这一直线?答案当时是肯定的,那么这个参数就能用。
那么,问题就来了,如果以 d , θ d, \theta d,θ 为参数空间横纵坐标,那应该是怎样的。我们下面来考察一下:
首先,我们先把这条直线用 d 和 θ \theta θ 表示出来,这个是高中数学题了,就不推导了(求解思路就是用 d 和 θ \theta θ 表征线上任意一点)。直接给出答案,这条线可以这么表示(这里没有常规地把 y 放在左侧,为了美观)
d = x c o s θ + y s i n θ d = xcos\theta + ysin\theta d=xcosθ+ysinθ
同样的方法,对于无数 d d d 和 θ \theta θ ,我们要满足原空间里经过 ( x 0 , y 0 ) (x_0,y_0