⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myedge.m

📁 根据输入的参数不同
💻 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 + -