我也说说Hough变换【转】
来源:互联网 发布:qq群淘宝客用什么软件 编辑:程序博客网 时间:2024/06/06 01:51
转自:http://www.narutoacm.com/archives/hough-transform/
概念什么的不定义了,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度,如图:
对图中所举例的位于第一象限的点P(x0,y0)来说,θ可取的范围为图中用箭头标注的那个范围。其中最小的那个θ对应的是右侧那个过(x0,y0)的直线越来越接近OP,最大的那个θ对应的是左侧那个过(x0,y0)的直线越来越接近OP。如在图中θ可取的范围大概就是(-θ0,-θ0+180),化为0到360的区间即为(0,180-θ0)U(360-θ0,360),如果强行取区间之外的θ值,算出的r则会表现出为负的结果。这种情况应当忽略这个θ值,就不用实现算出可取的θ范围然后枚举了。
例:
提取出的3条直线为:
- 我也说说Hough变换【转】
- 我也说说房价
- 我也说说盗版
- 我也说说“商业模式”
- 我也说说“商业模式”
- 我也说说大盘!
- 我也说说CSDN
- 我也说说c++
- 我也说说bogomips
- 我也说说ThreadLocal
- 我终于明白了Hough变换
- Hough变换检测直线【转】
- Hough变换
- Hough变换
- Hough变换
- Hough变换
- Hough变换
- Hough变换
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
- cvCreateVideoWriter 录制视频的一个可用程序
- 给js添加 in_array 方法
- 电力通信资源管理系统
- 关于Eclipse中各种小标志的说明
- 我也说说Hough变换【转】
- TDD测试驱动的javascript开发(2) ---- javascript面向对象 ~~ 深入学习javascript中prototype
- MyEclipse启动tomcat增加内存配置
- 跟我一起写makefile
- Android之一个简单计算器源代码
- android graphic笔记
- 常见的nlp工具包
- CRC16校验程序
- NVI(Non-Virtual Interface )