www.pudn.com > edge_detection.rar > edge_detection.m


%  小波模极大值用于边缘提取 
 
clc;clear 
 
%  下载图像 
load woman 
% X=double(imread('1.bmp')); 
SIZE=length(X);  %  图像尺寸 
     
%  多尺度 
m=1.0; 
delta=2^m; 
 
%  构造高斯函数的偏导 
N=20;  %  滤波器长度(需要调整,必须是偶数) 
A=-1/sqrt(2*pi);  %  幅度 
 
for index_x=1:N; 
    for index_y=1:N; 
        x=index_x-(N+1)/2; 
        y=index_y-(N+1)/2; 
        phi_x(index_x,index_y)=A*(x/delta^2).*exp(-(x.*x+y.*y)/(2*delta^2)); 
        phi_y(index_x,index_y)=A*(y/delta^2).*exp(-(x.*x+y.*y)/(2*delta^2)); 
    end 
end; 
 
phi_x=phi_x/norm(phi_x);  %  能量归一化 
phi_y=phi_y/norm(phi_y);  %  能量归一化 
 
%  对图象做行列卷积 
Gx=conv2(X,phi_x,'same'); 
Gy=conv2(X,phi_y,'same'); 
 
%  求梯度 
Grads=sqrt((Gx.*Gx)+(Gy.*Gy)); 
 
%  求幅角(梯度方向) 
angle_array=zeros(SIZE,SIZE);  %  角度 
 
%  遍历 
for i=1:SIZE; 
    for j=1:SIZE 
        if (abs(Gx(i,j))>eps*100)  %  x的绝对值足够大 
            p=atan(Gy(i,j)/Gx(i,j))*180/pi;  %  反正切求角度值(1,4象限) 
            if (p<0)        %  负的幅角(4象限) 
                p=p+360; 
            end; 
            if (Gx(i,j)<0 & p>180)     %  2象限的特殊处理 
                p=p-180; 
            elseif (Gx(i,j)<0 & p<180) %  3象限的特殊处理 
                p=p+180; 
            end 
        else  %  90或270度 
            p=90; 
        end 
        angle_array(i,j)=p;  %  幅角赋值 
    end 
end; 
 
%  找边缘 
edge_array=zeros(SIZE,SIZE); 
 
%  遍历 
for i=2:SIZE-1 
    for j=2:SIZE-1 
        if ((angle_array(i,j)>=(-22.5) & angle_array(i,j)<=22.5) | ... 
            (angle_array(i,j)>=(180-22.5) & angle_array(i,j)<=(180+22.5)))     %  0/180 
            if (Grads(i,j)>Grads(i+1,j) & Grads(i,j)>Grads(i-1,j)) 
                edge_array(i,j)=Grads(i,j); 
            end 
        elseif ((angle_array(i,j)>=(90-22.5) & angle_array(i,j)<=(90+22.5)) | ... 
                (angle_array(i,j)>=(270-22.5) & angle_array(i,j)<=(270+22.5))) %  90/270 
            if (Grads(i,j)>Grads(i,j+1) & Grads(i,j)>Grads(i,j-1)) 
                edge_array(i,j)=Grads(i,j); 
            end 
        elseif ((angle_array(i,j)>=(45-22.5) & angle_array(i,j)<=(45+22.5)) | ... 
                (angle_array(i,j)>=(225-22.5) & angle_array(i,j)<=(225+22.5))) %  45/225 
            if (Grads(i,j)>Grads(i+1,j+1) & Grads(i,j)>Grads(i-1,j-1)) 
                edge_array(i,j)=Grads(i,j); 
            end 
        else  %  135/215 
            if (Grads(i,j)>Grads(i+1,j-1) & Grads(i,j)>Grads(i-1,j+1)) 
                edge_array(i,j)=Grads(i,j); 
            end 
        end 
    end 
end 
 
%  去除伪边缘 
MAX_E=max(max(edge_array).');     %  最大幅度值 
edge_array=edge_array/MAX_E;      %  最大幅度值 
threshold=0.2;                    %  阈值(需要调整) 
 
%  遍历 
for m=1:SIZE 
    for n=1:SIZE 
        if (edge_array(m,n)>threshold) 
            edge_array(m,n)=1; 
        else 
            edge_array(m,n)=0; 
        end 
    end 
end 
 
%  显示图像和边缘 
figure(1) 
subplot(1,2,1) 
imshow(X,map) 
title('图像') 
subplot(1,2,2) 
imshow(edge_array) 
title('边缘') 
 
% 进一步的工作,连线...