gusucode.com > 做个图像直线检测的算法,主要是用来检测图像中的直线 > code/radon变换检测直线.m
%准备 clc,clear; %读入图像 % I=imread('ic.tif'); I=imread('Fig1006(a)(building).tif'); %图像二值化以方便进行radon变换 BW=edge(I,0.1); % 默认的二值化方式是sobel方法 % figure,imshow(BW); %radon变换 theta=0:179; %radon变换。获得从0到179每个幅角的 [R,rho]=radon(BW,theta); %每个平行直线的积分值(R)。rho是R的纵坐标,也是变换后的极坐标幅值; M=length(rho);N=length(theta); %theta是R横坐标,也就是变换后的极坐标幅角(0:179) %图像标识出极坐标图 figure,imagesc(theta,rho,R); colormap(hot); xlabel('\theta(幅角)'); ylabel('\rho(幅值)'); colorbar %找到峰值R最大的前X条直线 X=13; %找到前X条直线 nhood=11; %对以最值点为中心的nhood×nhood区域进行清零,以排除重复。 %此处nhood必须是奇数,以保证最值点在中心。默认值可以是max(3*ceil(size(R)/2)+1,1)。 for j=1:X [Rmax(1,j),RANK]=max(R(:)); %找出R最大值 yRmax=floor(RANK/M)+1; xRmax=mod(RANK,M); %找到最大值的纵横坐标 Rmax(2,j)=yRmax; %将找到的最大值的对应横坐标(比幅角多1)也保存下来 Rmax(3,j)=rho(xRmax); %将找到的最大值的对应纵坐标(幅值)也保存下来 % R(RANK)=0; %只清除最值点 for xi=-floor(nhood/2):floor(nhood/2) %将以最值点为中心的nhood×nhood矩阵清零 for yi=-floor(nhood/2):floor(nhood/2) xx=xRmax+xi;yy=yRmax+yi; if xx>0&xx<=M&yy>0&yy<=N R(xx,yy)=0; end end end end hold on plot(Rmax(2,:),Rmax(3,:),'linestyle','none','marker','s','color','b')%将这些最值点标示出来 hold off %峰值排序 Rmax(2,:)=(Rmax(2,:)-1)/180*pi;% Im1=BW;Im2=BW for i=1:X Im1=DrawLineR(Im1,Rmax(2,i),Rmax(3,i));%画直线 Im2=DrawLineS(Im2,Rmax(2,i),Rmax(3,i));%画线段 end figure,imshow(Im1); figure,imshow(Im2)