用matlab编程实现的各种图像边缘检测汇总

clear all;
close all;
warning off all;

I1 = imread('20.jpg');
I=rgb2gray(I1);%%如果是其他类型图像,请先转换为灰度图
I=histeq(I,64);
%%没有噪声时的检测结果
BW_roberts = edge(I,'roberts');
BW_prewitt = edge(I,'prewitt');
BW_laplace = edge(I,'log');
BW_canny = edge(I,'canny',0.15);
figure,imshow(I);
figure,imshow(BW_roberts);
figure,imshow(BW_prewitt);
figure,imshow(BW_laplace);
figure,imshow(BW_canny);

%%加入高斯噪声(μ=0,σ^2=0.01)检测结果
I_g1 = imnoise(I,'gaussian',0,0.01);
BW_roberts = edge(I_g1,'roberts');
BW_prewitt = edge(I_g1,'prewitt');
BW_laplace = edge(I_g1,'log');
BW_canny = edge(I_g1,'canny',0.15);
figure,imshow(I_g1);
figure,imshow(BW_roberts);
figure,imshow(BW_prewitt);
figure,imshow(BW_laplace);
figure,imshow(BW_canny);



%%%%%%%%%%%%%%%% 小波模极大值用于边缘提取 %%%%%%%%%%%%%%%%%%

% 图像灰度化
%I=imread('a2.jpg');
%X=rgb2gray(I);
X=I;
% 图像尺寸
[SIZEY,SIZEX]=size(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(SIZEY,SIZEX); % 角度

% 遍历
for i=1:SIZEY;
for j=1:SIZEX
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(SIZEY,SIZEX);

% 遍历
for i=2:SIZEY-1
for j=2:SIZEX-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.28; % 阈值(需要调整)

% 遍历
for m=1:SIZEY
for n=1:SIZEX
if (edge_array(m,n)>threshold)
edge_array(m,n)=1;
else
edge_array(m,n)=0;
end
end
end

% 显示图像和边缘
%figure,imshow(X);
%title('原始图像')
figure,imshow(edge_array);
%title('小波边缘检测')

%%%%%%%%%%%%%%%% 加入高斯噪声的小波模极大值用于边缘提取 %%%%%%%%%%%%%%%%%%

% 图像灰度化
%I=imread('a2.jpg');
%X=rgb2gray(I);
X=I_g1;
% 图像尺寸
[SIZEY,SIZEX]=size(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(SIZEY,SIZEX); % 角度

% 遍历
for i=1:SIZEY;
for j=1:SIZEX
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(SIZEY,SIZEX);

% 遍历
for i=2:SIZEY-1
for j=2:SIZEX-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.28; % 阈值(需要调整)

% 遍历
for m=1:SIZEY
for n=1:SIZEX
if (edge_array(m,n)>threshold)
edge_array(m,n)=1;
else
edge_array(m,n)=0;
end
end
end

% 显示图像和边缘
%figure,imshow(X);
%title('原始图像')
figure,imshow(edge_array);
%title('小波边缘检测')


相关文档
最新文档