我也说说Hough变换【转】

来源:互联网 发布:qq群淘宝客用什么软件 编辑:程序博客网 时间:2024/06/06 01:51

转自:http://www.narutoacm.com/archives/hough-transform/

概念什么的不定义了,Hough变换就是用来检测直线啊之类的东西,其实原理很简单,如图:

Hough

在xy直角坐标系中的一条直线,都可以唯一的映射成rθ空间的一个点。如对上图中的直线,就能映射成点(r,θ)。那么映射关系是怎样的呢?

设P点为点(x0,y0),原点为O(0,0),显然,对直线上的每一点Q(x,y),都有OP垂直于PQ,坐标形式表示则为(x0,y0) * (x-x0,y-y0) = 0,*代表点积。而x0=rcos(θ),y0=rsin(θ),代入化简即可得到:r=xcos(θ)+ysin(θ)

这样,对rθ空间上的一个点(r,θ),所有满足上式的点(x,y)都是在同一条直线上。也可以说xy空间中满足上式的直线对应rθ空间中的点(r,θ)。同样,对xy空间上的一点(x,y),也就对应着满足上式的在rθ空间中的一条曲线。(这绕啊绕的,实际上就是取决于你把x,y当成未知数还是把r,θ当成未知数)

如对xy空间中的一点(0,0),就对应着rθ空间中的曲线r=0(当然,这实际上是一个点),如果θ只取整数值,这条曲线就经过rθ中的点(0,0),(0,1),...(0,359),这里以度数为θ的单位。一般的,xy空间中点(x0,y0)对应的曲线实际上就是xy空间中绕点(x0,y0)旋转的所有直线所对应的所有的rθ空间中的点的组合(如果你问为什么?你可能被转糊涂了。这里回答下为什么。想想看,在xy空间中过点(x0,y0)的任意一条直线,对应的rθ空间中的点设为(r0,θ0),因此该点满足r0=x0cos(θ0)+y0sin(θ0),因此该点在曲线r=x0cos(θ)+y0sin(θ0)上。另外,对在曲线r=x0cos(θ)+y0sin(θ0)上的任意一点(r0,θ0),即满足r0=x0cos(θ0)+y0sin(θ0),因此该点必对应xy空间中过点(x0,y0)的一条直线)。

这样,对图像中每个待观察的像素的位置,求出对应的rθ空间中的每个点(可枚举θ从0到360度)。最后统计在rθ空间中哪个点所对应的xy空间中的点最多,该点就为xy空间中的一条直线。r的范围显然在sqrt(w*w+h*h)内,其中w和h是图像的宽度和高度。

然而,每个点(x0,y0)能够取的θ值不一定是所有的0到360度,如图:

Hough1

对图中所举例的位于第一象限的点P(x0,y0)来说,θ可取的范围为图中用箭头标注的那个范围。其中最小的那个θ对应的是右侧那个过(x0,y0)的直线越来越接近OP,最大的那个θ对应的是左侧那个过(x0,y0)的直线越来越接近OP。如在图中θ可取的范围大概就是(-θ0,-θ0+180),化为0到360的区间即为(0,180-θ0)U(360-θ0,360),如果强行取区间之外的θ值,算出的r则会表现出为负的结果。这种情况应当忽略这个θ值,就不用实现算出可取的θ范围然后枚举了。

例:

sy

提取出的3条直线为:

trires

原创粉丝点击