赞
踩
最近做毕设,基础是利用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); % 在原图上绘出直线
到此,直线检测的结果便在原图上呈现出来了,放一张效果图。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。