图像处理分析过程中,检测特定的形状是重要的一步。霍夫变换(Hough)通过转换坐标系,将特定形状的检测映射到参数空间中,从而根据参数空间中的值来确定特定形状的相关信息。
Hough变换的比较简单的应用例子有检测直线和检测圆。
检测直线
设空间中有若干点,我们要判断这些点是否能构成一条直线,即为直线检测。平面中直线的通用公式为
xcos(θ)+ysin(θ)=ρ
。常用的
y=wx+b
公式,因为不能兼容
y=b
的情况,所以不能使用。对于某个点,其坐标是
(xi,yi)
,过该点的直线有无数条,这些直线统一表示为
xicos(θ)+yisin(θ)=ρ
,其中
xi,yi
是常量。反过来看,代表这些直线的公式,可以看做
θ
为自变量,
ρ
为因变量,
xi,yi
为常量参数的直线公式。这样,在x-y空间过
(xi,yi)
的无数条直线,可以在
θ−ρ
空间中用一条线代表。见下图:
上图是x-y空间,下图是
θ−ρ
空间。其中红、绿、蓝三条线可以汇聚成一个点,说明这三条线对应的点,其在
θ−ρ
空间中的直线参数是一样的。反过来就是说,穿过这三个点的无数直线中,有“三”条直线,其
θ,ρ
值相同,这“三“条直线是一根直线,即这三个点可以共线。
检测圆
设空间有若干点,我们要判断这些点是否能构成一个圆的轮廓,即为圆检测。圆的表达式为
(x−x′)2+(y−y′)2=R
,参数有
x′,y′,R
。这说明,圆对应的映射空间是三维的,即
x′−y′−R
空间。
x′,y′
都表示空间,因此我们可以暂时将R设为常量,构建
x′−y′
空间,令x’为自变量,y’为因变量,作图如下:
上图是x-y空间,下图是x’-y’空间。图中绘制了一个圆和一个矩形,其中圆的轮廓并不是完全规则的。经过Hough变换后,圆上的点的变换曲线基本汇聚在一起,而矩形上的点则不能汇聚,这样就检测到圆。由于我们获取的图像并不一定是规则图形,其在参数空间中不一定能汇聚到一个点,而是在一个区域中汇聚起来,为了容许这类误差,我们可以用窗来检测参数空间中的曲线汇聚区域,而不是找曲线汇聚点,以此来检测不完全规则的特定形状。
如果我们不知道R的值,那么我们就需要给定R取值的离散区间
[R1,R2...Rn]
,取该区间中的值,重复做n次Hough变换检测。这样的话工作量会非常大,为了提升效率,往往会借助图像中的其他特征。
另外,我们可以看出,由于不知道圆的尺度,我们不得不重复做多次检测。在实际的形状检测工作中,我们并不知道需要检测的复杂形状,经过了何种平移、缩放、旋转甚至是扭曲,因此需要引入不变性特征,或者针对所有可能的平移、缩放、旋转变换情况,统统做一遍检测。物体检测跟踪需要相当多的计算量。据了解,人脑为了进行视觉模式识别,至少消耗了一半的神经资源,所以人可以闭目养神,却不能捂耳朵、捏住鼻子养神:)