%%%%%%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