详解 Hough 变换(上)基本原理与直线检测

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(xx0)+y0
说明:用这个 y = kx + b 这个式子不好,因为后面例子都是把 x、y 放到一侧,两者式子下,过点限制条件是由差别的。使用 y − k x = b y-kx = b ykx=b y − k x − b = 0 y-kx-b=0 ykxb=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 ykx=y0kx0       ykxb=y0kx0b
也即
y − k x = ( y 0 − k x ) y - kx = (y_0-kx) ykx=(y0kx)
这里会衍生出一个问题,即好像一个参数 k 就可以确定这一直线了。到这节最后会说到这个问题。先忽略之,或自己加以理解。

依据上式,也就是以 k, y 0 − k x 0 y_0-kx_0 y0kx0​​​ 为参数,即 k 当横轴, y 0 − k x 0 y_0-kx_0 y0kx0​​ 当纵轴,或者写为我们更常见的
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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值