资源简介

运用到边沿检测,霍夫变换等

资源截图

代码片段和文件信息

sourcePic=imread(‘xcv-2.jpg‘);
sourcePic=rgb2gray(sourcePic);

sourcePic=im2double(sourcePic);

%使用水平和垂直Sobel算子自动选择阈值 
edgePic=edge(sourcePic‘sobel‘‘horizontal‘); 
figureimshow(edgePic)title(‘水平图像边缘检测‘); % 显示边缘探测图像 

edgePic=edge(sourcePic‘sobel‘‘vertical‘); 

figureimshow(edgePic)title(‘垂直图像边缘检测‘); % 显示边缘探测图像 

edgePic=edge(sourcePic‘sobel‘); 

[heightwidth]=size(edgePic); 

 %图像中直线的个数
 LINE_COUNT = 100;
 
 % Hough变换检测直线,g(x)=(ap)为边界点对应的平面  
 ma=180; %a的值为0到180度  

 mp=round(sqrt(height^2+width^2)); %对应P的最大值  

 npc=zeros(ma2*mp); %用于记录(ap)对应的点的个数  
 
 MAP=zeros(height width);
 
 npp=cell(ma2*mp); %用于记录(ap)对应的点的坐标  
 
 for i=1:height %计算(ap)的值,并做相应记录  

     for j=1:width  

         if(edgePic(ij)==1)  

             for k=1:ma
                 p = round(i*cos(pi*k/180)+j*sin(pi*k/180));
                 npc(kmp+p)=npc(kmp+p)+1;
                 npp{kmp+p}=[npp{kmp+p}[ij]‘];
             end  

         end  

     end  

 end


LNum = 0;                       %得到的直线的数目
LPC = zeros(LINE_COUNT6);      %直线的参数集合 元素为 [Number][k][b][a][p][DP]   分别为直线的: 编号 斜率 截距 角度a 弦长p 是否为消失线
index = 1;


%提取直线的阀值
LT = 90;

for i=1:ma      

     for j=1:mp*2  

         if(npc(ij) > LT) 
             
                lk= -cot(pi*i/180);
                lb= round((j - mp - 1)/sin(pi*i/180));

                %保存直线的参数,顺序为 编号 (kb) (ap)
                LNum = LNum + 1;
                
                LPC(index1) = LNum;%存储直线的编号
                LPC(index2) = lk;
                LPC(index3) = lb;
                LPC(index4) = i;
                LPC(index5) = j;
                
                index = index + 1;
                
                lp=npp{ij};
                for k=1:npc(ij)
                     MAP(lp(1k)lp(2k))=1;  
                end
         end  

     end  

end  

figureimshow(MAP);title(‘检测出的直线图‘);

%求出总共有多少交点
InterCount = LNum*(LNum - 1)*0.5;

LInter = zeros(InterCount4);           %直线的交点集合 元素为 两条相交直线的编号 ij 和 交点坐标 xy . 有 i < j
                                        %元素个数为 n*(n - 1)/2
%下面的代码是求直线的交点
T =1;

LIC = 0;                                %直线交点的个数

for i = 1:LNum - 1
    for j = i + 1:LNum
        
        k1 = LPC(i2);
        b1 = LPC(i3);

        k2 = LPC(j2);
        b2 = LPC(j3);
        
        dp = k1 - k2;                   %得到两条直线斜率之差
        
        if(abs(dp - 0) > 10e-03)        %如果斜率之差太小,就可以认为这两条直线平行而没有交点。
            
            LIC = LIC + 1;              %直线交点个数加一
            
            X = (b2 - b1)/(k1 - k2);    % X = (b2 - b1)/(k1 - k2)
            Y = k1 * X + b1;            % Y = k1 * X + b1
            LInter(LIC1) = i;
            LInter(LIC2) = j;
            LInter(LIC3) = round(X);
            LInter(LIC4) = round(Y);
            
        end
    end
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%以下的部分是求消失点和消失线的参数
%%%

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        9092  2012-09-04 18:13  All.m

评论

共有 条评论