您的位置:首页 > 其它

使用radon变换进行直线检测

2017-04-26 19:46 1201 查看
    最近做毕设,基础是利用radon变换进行直线检测。radon变换其实是对hough变换算法的优化,具体原理可自行查阅相关资料,在此不再赘述。本文要介绍的是利用matlab自带的radon变换函数进行直线检测,难点在于得到radon变换的结果后如何提取峰值并显示在原图上,下面将进行详细介绍。

    matlab中自带的radon函数使用方法如下:[R,x]=radon(F,theta);其中F为待检测的图像,需为灰度图像,theta是检测的角度范围,通常取0:179,R是radon变换的结果,是一个M*N的二维矩阵,其中M与x相等,是平行直线距离原点的距离(需结合原理理解),N是变换的角度范围,theta取0:179时,N为180。变换后可对结果进行显示。



    进行radon变换后。会得到一个二维矩阵,矩阵中峰值所在表征了原图中直线的信息,如上图所示,其中的黄点表示峰值,只要检测出峰值所在的位置,就可以得到直线的位置信息。峰值检测使用函数findpeaks(),由于该函数只能对一维向量进行检测,因此需事先对radon变换结果进行处理:

J=reshape(R,M*N,1);                    

[PKS,LOCS]= findpeaks(J,'THRESHOLD',6);
    使用findpeaks函数时,可以通过阈值控制检测结果的个数。其中Locshui返回一维向量中峰值所在的位置,根据原矩阵大小,我们可以计算出相应的直线信息:

d=mod(LOCS(i),M)-(M-1)/2;       

 theta= fix(LOCS(i)/M);
    下一步的任务就是根据直线信息将直线在原图中绘出,绘图原理参见https://cn.mathworks.com/help/images/detect-lines-using-the-radon-transform.html?searchHighlight=radon%20transform%20peak&s_tid=doc_srchtitle ,此处给出部分代码:
             k=tan(theta*pi/180); %直线的斜率

             x0=64;y0=64;

             b=y0-k*x0;

             k2=-1/k;                 %直线垂线的斜率

              syms x

             f=sqrt((k*x+b-64)^2+(x-64)^2)-d(i);  %求出到中心点距离为d的点

             x=solve(f,x);

             y=k*x+b;
             b2=y-k2*x;      %得到直线截距

             x1=0;              %任意求出直线上两点,用于画线

             y1=k2*x1+b2;

             x2=128;

             y2=k2*x2+b2;

         

              line([x1,x2],128-[y1,y2],'color','r','LineWidth',1);  % 在原图上绘出直线
    到此,直线检测的结果便在原图上呈现出来了,放一张效果图。
                         

 




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: