📄 myedge.m
字号:
function value=myedge(image,kind,num);
[ImW,ImH]=size(image);
switch kind
case 'sobel' h=[-1 -2 -1;0 0 0;1 2 1];
X=filter2(h,image);
Y=filter2(h',image);
result=abs(X)+abs(Y);
Bw_result=double(result)/255;
for i=1:ImW
for j=1:ImH
if Bw_result(i,j)<num
value(i,j)=0;
else
value(i,j)=1;
end
end
end
case 'prewitt'
h1=[-1 -1 -1;0 0 0;1 1 1];
h2=[-1 0 1;-1 0 1;-1 0 1];
X=filter2(h1,image);
Y=filter2(h2,image);
result=abs(X)+abs(Y);
Bw_result=double(result)/255;
for i=1:ImW
for j=1:ImH
if Bw_result(i,j)<num
value(i,j)=0;
else
value(i,j)=1;
end
end
end
case 'roberts'
h1=[0 -1;1 0];
h2=[1 0;0 -1];
X=filter2(h1,image);
Y=filter2(h2,image);
result=abs(X)+abs(Y);
Bw_result=double(result)/255;
for i=1:ImW
for j=1:ImH
if Bw_result(i,j)<num
value(i,j)=0;
else
value(i,j)=1;
end
end
end
case 'marr'
size=13;
sigma=num;
h=fspecial('log',size,sigma);
h=h-sum(h(:))/(size^2);
X=filter2(h,image);
value=zeros(ImW,ImH);
delta=mean2(abs(X(1:ImW,1:ImH)));
Bw_result=X;
for i=2:ImW-1
for j=2:ImH-1
if(Bw_result(i,j)<=0)
if((Bw_result(i,j-1)>0)&&(Bw_result(i,j-1)-Bw_result(i,j)>delta))
value(i,j)=1;
end
if((Bw_result(i,j+1)>0)&&(Bw_result(i,j+1)-Bw_result(i,j)>delta))
value(i,j)=1;
end
if((Bw_result(i-1,j)>0)&&(Bw_result(i-1,j)-Bw_result(i,j)>delta))
value(i,j)=1;
end
if((Bw_result(i+1,j)>0)&&(Bw_result(i+1,j)-Bw_result(i,j)>delta))
value(i,j)=1;
end
else
if ((Bw_result(i,j-1)<0)&&(Bw_result(i,j)-Bw_result(i,j-1)>delta))
value(i,j)=1;
end
if ((Bw_result(i,j+1)<0)&&(Bw_result(i,j)-Bw_result(i,j+1)>delta))
value(i,j)=1;
end
if ((Bw_result(i-1,j)<0)&&(Bw_result(i,j)-Bw_result(i-1,j)>delta))
value(i,j)=1;
end
if ((Bw_result(i+1,j)<0)&&(Bw_result(i,j)-Bw_result(i+1,j)>delta))
value(i,j)=1;
end
end
end
end
case 'canny'
h1=[-1 -1;1 1];
h2=[1 -1;1 -1];
h=fspecial('gaussian');
G=filter2(h,image);
X=filter2(h1,G);
Y=filter2(h2,G);
result=sqrt(X.*X+Y.*Y);
dmx=max(result(:));
if(dmx>0)
result=result/dmx;
end
[cts,x]=imhist(result,64);
hth=min(find(cumsum(cts)>num*ImW*ImH))/64;
lth=0.5*hth;
r=[];
c=[];
for i=2:ImW-1
for j=2:ImH-1
if(((Y(i,j)<=0)&&(X(i,j)>-Y(i,j)))||((Y(i,j)>=0)&&(X(i,j)<-Y(i,j))))
delta=abs(Y(i,j)/X(i,j));
grad1=result(i,j+1)*(1-delta)+result(i-1,j+1)*delta;
grad2=result(i,j-1)*(1-delta)+result(i+1,j-1)*delta;
elseif(((X(i,j)>0)&&(X(i,j)<=-Y(i,j)))||((X(i,j)<0)&&(X(i,j)>=-Y(i,j))))
delta=abs(X(i,j)/Y(i,j));
grad1=result(i-1,j)*(1-delta)+result(i-1,j+1)*delta;
grad2=result(i+1,j)*(1-delta)+result(i+1,j-1)*delta;
elseif(((X(i,j)<=0)&&(X(i,j)>Y(i,j)))||((X(i,j)>=0)&&(X(i,j)<Y(i,j))))
delta=abs(X(i,j)/Y(i,j));
grad1=result(i-1,j)*(1-delta)+result(i-1,j-1)*delta;
grad2=result(i+1,j)*(1-delta)+result(i+1,j+1)*delta;
elseif(((Y(i,j)<0)&&(X(i,j)<=Y(i,j)))||((Y(i,j)>0)&&(X(i,j)>=Y(i,j))))
delta=abs(Y(i,j)/X(i,j));
grad1=result(i,j-1)*(1-delta)+result(i-1,j-1)*delta;
grad2=result(i,j+1)*(1-delta)+result(i+1,j+1)*delta;
end
if((result(i,j)>=grad1)&&(result(i,j)>=grad2))
if(result(i,j)>=hth) value(i,j)=1; r=[r;i]; c=[c;j];
elseif(result(i,j)>=lth) value(i,j)=1; end
end
end
end
value=bwselect(value,c,r,8);
value=double(value);
otherwise
eid = sprintf('Images:%s:error', mfilename);
msg = 'error';
error(eid,'%s',msg);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -