霍夫变换

学过图像处理的人都知道,霍夫变换是用来检测线的,它的原理也非常简单,就是将离散的点映射到参数空间,在参数空间内累计最多的点就是初始空间内决定线的参数。

检测直线

霍夫变换检测直线是最基本的应用,其本质就是已知很多点 (x0,y0),(x1,y1)...... ( x 0 , y 0 ) , ( x 1 , y 1 ) . . . . . . 求直线 y=kx+b y = k x + b 中的斜率 k k 和偏移b

学过数学的人都知道,两点决定一条直线,只要知道两组 (x,y) ( x , y ) 就可以得到唯一的 k k b,因此可以通过任意两点得到若干组 (k,b) ( k , b ) ,选取出现次数最多的一组 (k,b) ( k , b ) 就是要求的参数。

当然,opencv中采取的并不是这种方法,而是从直角坐标系映射到极坐标系的方法。但是本质还是相同的,极坐标系下求解的是 (ρ,θ) ( ρ , θ ) ,但是归根结底,决定直线的就是两个参数。极坐标的映射方法是对于直角坐标系下的点,每隔一定的角度如 π/10 π / 10 画过该点的直线,对应的 (ρ,θ) ( ρ , θ ) 映射到极坐标系下,这样每个点在极坐标系下都可以映射为周期为 2π 2 π 的类似于正余弦曲线一样的曲线,将所有的点通过这种方式映射后,在极坐标系下,大多数曲线会交于一个点,通过投票的方式得到该点,那么该点所对应的 (ρ,θ) ( ρ , θ ) 就是要求的结果。

检测圆

圆的公式为 (xx0)2+(yy0)2=r2 ( x − x 0 ) 2 + ( y − y 0 ) 2 = r 2 根据之前对检测直线的讨论,对圆的检测本质上就是求三个参数 (x0,y0,r) ( x 0 , y 0 , r ) ,所以就可以通过任意三点求解三个未知数,然后对 (x0,y0,r) ( x 0 , y 0 , r ) 这个集合投票,最终出现次数最多的一组参数就是决定圆方程的参数

一般情况(椭圆等)

更一般的情况,也就是对一般方程曲线的拟合,例如椭圆等等,本质上就是看要求未知参数的个数来决定解方程所需要的点的个数,最后将参数组投票

霍夫变换作为一个函数在opencv中已经高效的实现,在这里不赘述,自己通过循环写的霍夫变换性能上无法跟opencv相提并论,因此除非是一般曲线的拟合,直线和圆的检测建议直接调用opencv函数

霍夫变换一般步骤

另外,在做霍夫变换时,我们不可能将所有的点都做映射,这样计算量太大,因此我们一般会
1)先用canny算子对边缘轮廓做提取,主要目的是降维,这样可以尽可能的去掉平滑区域的点减少计算量,
2)之后利用二值的方法(包括开闭操作等)提取轮廓,去掉噪声等扰动,主要目的是在拟合线性方程时尽可能准确,
3)霍夫变换完成空间映射
4)计数器统计出现次数最高的未知系数组合,如 (ρ,θ) ( ρ , θ )

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值