ch7_2_3.m

来自「这是用MATLAB来进行数字图象处理的程序。都是一些很常用的」· M 代码 · 共 72 行

M
72
字号
%%%%%%5相位编组法实现纹理直线边缘的检测程序代码(代码以子函数形式给出)
function gradephase(x)
[m,n]=size(x);
bw=edge(x,'sobel');
gy=x(1:m-1,1:n-1)-x(2:m,1:n-1);
gx= x(1:m-1,1:n-1)-x(1:m-1,2:n);
g=gy./(gx+eps);
ph-atan(g)+(sign(gx)<0&sign(gy)>0)*pi+...
    (sign(gx)<0&sign(gy)>0)+ (sign(gx)>0&sign(gy)<0)*2*pi+(sign(gx)==0)*pi;
grdgp=floor(ph/pi*4);
cn=0;s=[ ];
In_spt=cell(1,1);
% cell数组类似c语言的指针,可以动态改变大小。S用来存放直线编组区域内的像%素坐标。
pline=[];
for  i=2:m-1
    for  j=2:n-1
        if  bw(i,j)==D&gradgp(i,j)==0 %搜索边缘点。
            ph_cp=gradgp(i,j);gradgp(i,j)=0;bw(i,j)=0;
            cn=cn+1;p=[i,j];
            s=[s,p];in_spt(cn)-[p];
            while ~isempty(s) %为了在8个邻域进行搜索,采用入栈和出栈操作。
                [cs,rs]=size(s);
                ps=s(:,rs);s=s(:,1:rs-1);
                col=ps(1,1);row=ps(2,1);
                if  legal(col+1,row,m,n)&grdgp(col+1,row)=ph_cp
                    s= [s,[col+1,row]’]; in_spt(cn)=[ in_spt(cn), [col+1,row]’];
                    bw(col+1,row)=0;gradgp(col+1,row)=0;
                end
                if  legal(col+1,row+1,m,n)&grdgp(col+1,row+1)=ph_cp
                    s= [s,[col+1,row+1]’]; in_spt(cn)=[ in_spt(cn), [col+1,row+1]’];
                    bw(col+1,row+1)=0;gradgp(col+1,row+1)=0;
                end
                if  legal(col,row+1,m,n)&grdgp(col,row+1)=ph_cp
                    s= [s,[col,row+1]’]; in_spt(cn)=[ in_spt(cn), [col,row+1]’];
                    bw(col,row+1)=0;gradgp(col,row+1)=0;
                end
                if  legal(col-1,row+1,m,n)&grdgp(col-1,row+1)=ph_cp
                    s= [s,[col-1,row+1]’]; in_spt(cn)=[ in_spt(cn), [col-1,row+1]’];
                    bw(col-1,row+1)=0;gradgp(col-1,row+1)=0;
                end
                if  legal(col-1,row+1,m,n)&grdgp(col-1,row+1)=ph_cp
                    s= [s,[col-1,row+1]’]; in_spt(cn)=[ in_spt(cn), [col-1,row+1]’];
                    bw(col-1,row+1)=0;gradgp(col-1,row+1)=0;
                end
                if  legal(col-1,row,m,n)&grdgp(col-1,row)=ph_cp
                    s= [s,[col-1,row]’]; in_spt(cn)=[ in_spt(cn), [col-1,row]’];
                    bw(col-1,row)=0;gradgp(col-1,row)=0;
                end
                if  legal(col,row-1,m,n)&grdgp(col,row-1)=ph_cp
                    s= [s,[col,row-1]’]; in_spt(cn)=[ in_spt(cn), [col,row-1]’];
                    bw(col,row-1)=0;gradgp(col,row-1)=0;
                end
                if  legal(col-1,row-1,m,n)&grdgp(col-1,row-1)=ph_cp
                    s= [s,[col+1,row-1]’]; in_spt(cn)=[ in_spt(cn), [col+1,row-1]’];
                    bw(col+1,row-1)=0;gradgp(col+1,row-1)=0;
                end
                %以上判断是在8个方向搜索相同方向的象素。
                If   length(in_spt{cn})<=10
                In_spt{cn}=[];
                cn=cn-1;
                %虑除短线段
                else
                    plane=draw_1(in_spt{cn});
                    %实现画线功能,代码与Hough变换中的代码相同。
                    pline=[pline,plne];
                    c(i)=length(in_spt{cn});
            end
        end
    end
end
end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?