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)