Hough变换检测直线

Hough变换检测直线

1.1 Hough变换

      计算机识别中,常常需要从图像上寻找特定形状的图形,如果直接利用图像点阵进行搜索判断显然难以实现,这时就需要将图像像素按一定的算法映射到参数空间。Hough变换提供了一种将图像像素信息按坐标映射到参数空间的方法,通过它构建的参数空间可以容易地对特定形状进行判断。

Hough变换是一种利用图像的全局特征将特定形状的边缘像素连接起来,形成连续平滑边缘的一种方法。它通过将源图像上的点映射到用于累加的参数空间,实现对已知解析式曲线的识别。Hough变换常用于对图像中的直线和圆进行识别。

 1.2直线的Hough变换

       线的解析式有多种形式,由于用斜率描述的直线存在斜率无穷大的特殊情况,这里选用直线的极坐标描述:ρ=хcos(θ)+уsin(θ)

式中ρ为直线到原点的距离,θ为限定了直线的斜率。对于任意一组确定的(ρθ),上式都可以唯一确定一条直线。开辟二维参数空间Hρθ),对ρθ整数化,则对于任意有限平面区域,参数空间H可以表示为有限个点的集合。而Hρθ)中任意点都一一对应原平面区域上的一条直线。

       将上述结论推广到任意平面图像上可知,图像上任意直线区域都可以一一对应参数空间Hρθ)中一个点,而图像上的任意像素都同时存在于很多直线区域之上。可以将图像上的直线区域想象为容器,把特定像素想象成放在容器中的棋子,只不过在这里,每个棋子都可以同时存在于多个容器中。那么Hough变换可以理解为依次检查图像上的每个棋子(特定像素),对于每个棋子,找到所有包含它的容器(平面上的直线区域),并为每个容器的计数器加1,这们就可以统计出每个容器所包含的棋子数量。当图像中某个直线区域包含的特定像素足够多(大于设定的阈值K)时,就可以认为直线区域表示的直线存在。

       用二维向量(ρθ)描述图像上的每一条直线区域,则可将图像上的直线区域计数器映射到参数空间Hρθ)中的存储单元。由于ρ为直线区域到原点的距离,因此对于对角线长度为n的图像,固定左上角为原点,可得到ρ的取值范围为[0n],令θ1度为增量,可得到θ的取值范围为[0360]。定义二维数组HoughBuf[n][360]作为存储单元,其中对于任意(ρθ)决定的直线区域,计数器为HoughBuf[ρ][ θ]。对于直线的Hough变换过程可以简单描述为,依次遍历图像的所有像素,对于每个像素判断是否满足特定的条件,若满足则对经过该像素的所有直线区域的计数器加1,否则继续判断下一个像素。为了得到经过某个像素的所有直线区域,可以依次用θ的所有可能取值,借助此像素的坐标和直线的极坐标方程计算ρ,而每一组(ρθ)就对应了一条经过此像素的直线区域。

       了避免在Hough变换中多次重复计算三角函数值,可以采用查表的方法提高效率。在进行变换之前,首先对0359度范围内所有整数角度的三角函数值进行计算,将计算结果按下标保存在线性数组中,使用时只需按照下标从数值中取值即可。

         此方法可用如下代码来实现:

? 查看代码 CPP
1
2
3
4
5
6
7
double sinvalue[360];
double cosvalue[360];
for (int i=0;i<360;i++)
{
 sinvalue[i] = sin(i*3.1415926/180);
 cosvalue[i] = cos(i*3.1415926/180);
}




Hough变换的主要流程可用以下代码来实现:

? 查看代码 CPP
 
 
for(y=0;y<h;y++)
   for (x=0;x<w;x++)
   {
    //对的所有取值进行计算
    for (i=0;i<360;i++)
    {
     if (pixel[y*w+x] > k)//若像素灰度大于阈值
     {
      tp = (int)(x*sinvalue[i]+y*cosvalue[i]);
      if(tp<0) 
       continue;
      //计数器累加
      houghBuf[tp][i] += 1;
     }
    }
   }
   w = 360;//将宽度设定为Hough变换图像的宽度
   h = p;//将高度设定为Hough变换图像的高度


 

        若将Hough变换得到的各直线区域的计数器的值看作图像的灰度,把用于存储的二维数组看做像素矩阵,则可得到Hough变换的图像,图中灰度较高的点标示出特定像素较集中的直线区域。Hough变换图像按照(ρθ)坐标系分布,水平方向为θ轴,垂直方向为ρ轴,每个(ρθ)坐标点对应源图像的一条直线区域,对于同一行的坐标点对应的直线区域与原点具有相同的距离,处于同一列的坐标点对应的直线区域相互平行。同时,源图像中直线越长越规则,Hough变换图像上对应的点灰度就越高,源图像中直线线宽越宽,Hough变换图像上对应的点直径就越大。源图像中有几条直线,在此Hough变换图像中就有几个亮点,根据每个亮点中心所在的坐标,就很容易得到原直线的解析式。


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值