本文将用matlab实现拉布拉斯算子提取边缘,锐化图像。分别采用空域和频域两种方法。
空域
步骤:
1.读取图像/(标定)
2.生成空间滤波器(fspecial('laplacian',0))
3.卷积(m = imfilter(f,w,'replicate'))
clear all;
f = imread('D:\moon.tif')
%a
figure(1)
imshow(f,[]);
title('a')
% b
w = fspecial('laplacian',0); %生成空间滤波器
m = imfilter(f,w,'replicate'); %'replicate'通过复制外边界的值来扩展 默认相关
figure(2)
imshow(m,[]);
title('b')
%c
f2 = im2double(f); %标定,将负数变为0,有更好的锐化效果
n = imfilter(f2,w,'replicate');
figure(3)
imshow(n,[])
title('c')
%d
m1 = f - m;
figure(4)
imshow(m1,[]);
title('d')
%e
n1 = f2 - n;
figure(5)
imshow(n1,[]);
title('e')
频域
步骤:
1.读取图像
2.补0,使图像长、宽变为原来两倍
3.将图像移到补零后的中心
4.傅里叶变换
5.在频域进行运算
6.傅里叶逆变换取实部
7.把图像移回原来位置并取原来size的区域
%步骤1
clear all;
f = imread('D:\moon.tif')
f=double(f);
[m,n]=size(f);
%a
figure(1)
imshow(f,[]);
title('origin')
%步骤2
p=2*m;
q=2*n;
A=zeros(p,q);
for i=1:m
for j=1:n
A(i,j)=f(i,j);
end
end
%步骤3
for i=1:p
for j=1:q
A(i,j)=A(i,j)*(-1)^(i+j);
end
end
%步骤4
I2=fft2(A);
%步骤5
for i=1:p
for j=1:q
D(i,j)=sqrt((i-p/2)^2+(j-q/2)^2);
end
end
X=zeros(p,q);
%pi=3.14
for i=1:p
for j=1:q
X(i,j)=-4*pi^2*D(i,j)^2;
Y(i,j)=X(i,j)*I2(i,j);
end
end
%步骤6
gp3=real(ifft2(Y));
%步骤7
for i=1:p
for j=1:q
gp3(i,j)=gp3(i,j).*(-1).^(i+j);
end
end
figure(3);
imshow(gp3,[]);
%归一化,目的是让后面gs的第一项和第二项同一个数量级
gp3max = max(gp3(:));
g3 = gp3(1:m,1:n);
k=10; %k自己取,用来改变锐化项的比例
gs = f-k*g3/gp3max;
figure(2)
imshow(gs,[]),title('拉普拉斯锐化图')
网友评论