实验三 图像的傅立叶变换
1.启动MATLAB程序,读入一幅图像;对图像做FFT。使用’subplot’命令,同时显示原始图像其频谱图;
1.1实验过程:
首先读取一幅图像,然后将这幅图像归一化到0~1之间,然后对图像做二维离散傅立叶变换,然后做快速傅里叶变换,即直流分量移到频谱中心,让正半轴部分和负半轴部分的图像分别关于各自的中心对称,然后取傅立叶变换的实部,然后做频谱对数变换,就得到原图像的频谱图,最后将原图像和对应的频谱图显示出来。
1.2代码及图像
I=imread('f:\lena.jpg');
%读入图像
F=fft2(im2double(I));
%FFT
F=fftshift(F);
%FFT频谱平移
F=real(F);
T=log(F+1);
%频谱对数变换
subplot(1,2,1),imshow(I),title('原始图像');
subplot(1,2,2),imshow(T,[]),title('原始图像其频谱图');
2. 读入一幅图像,分别为图像添加椒盐、高斯噪声,做FFT变换。使用’subplot’命令,将原始图像、原始图像频谱图、添加噪声后的图像,以及噪声图像的频谱图同时显示出来。
2.1实验过程
得到原始图像的频谱图的方法同上,然后对原图像模拟叠加密度为0.04的椒盐噪声,然后添加模拟均值为0方差为0.02的高斯噪声,然后得到噪声图像的频谱图,方法同上,最后显示所有图像。
2.2代码及图像
I=imread('f:\lena.jpg');
%读入图像
F=fft2(im2double(I));
%FFT
F=fftshift(F);
%FFT频谱平移
F=real(F);
T=log(F+1);
%频谱对数变换
subplot(3,2,1),imshow(I),title('原始图像');
subplot(3,2,2),imshow(T,[]),title('原始图像其频谱图');
S=imnoise(I,'salt & pepper', 0.04); %模拟叠加密度为0.04的椒盐噪声
K=fft2(im2double(S));
%FFT
K=fftshift(K);
%FFT频谱平移
K=real(K);
T=log(K+1);
%频谱对数变换
subplot(3,2,3),imshow(S),title('添加椒盐噪声后的图像');
subplot(3,2,4),imshow(T,[]),title('椒盐噪声频谱图');
G=imnoise(I,'gaussian',0,0.02);%模拟均值为0方差为0.02的高斯噪声,
H=fft2(im2double(G));
%FFT
H=fftshift(H);
%FFT频谱平移
H=real(H);
T=log(H+1);
%频谱对数变换
subplot(3,2,5),imshow(G),title('添加高斯噪声后的图像');
subplot(3,2,6),imshow(T,[]),title('高斯噪声频谱图');
3. 读入一幅图像,对图像分别进行高斯低通、巴特沃兹低通、高斯高通和巴特沃兹高通频域滤波,比较其锐化和平滑效果;
3.1实验过程
对于高斯低通频域滤波,首先求原图像的频谱图,然后根据二维高斯低通滤波器(GLPF)定义,对频谱图做高斯低通滤波,使低频通过而使高频衰减,最后做快速傅里叶逆变换,结果发现滤波后的图像变模糊,比原始图像减少尖锐的细节部分而突出平滑过渡部分;对于巴特沃兹低通频域滤波,然后根据二级巴特沃思低通滤波器(BLPF)定义,对频谱图做巴特沃兹低通滤波,使低频通过而使高频衰减,最后做快速傅里叶逆变换,结果发现滤波后的图像变模糊,比原始图像减少尖锐的细节部分而突出平滑过渡部分;经对比图像后发现,经过巴特沃思低通滤波的图像比经过高斯低通频域滤波的图像更平滑。
对于高斯高通频域滤波,首先求原图像的频谱图,然后根据截频距原点为D0的高斯高通滤波器(GHPF)定义,对频谱图做高斯高通滤波,使高频通过而使低频衰减,最后做快速傅里叶逆变换,结果发现滤波后的图像变锐化,比原始图像减少平滑过渡而突出边缘等细节部分;对于巴特沃兹高通频域滤波,然后根据二阶且截至频率距原点的距离为D0的巴特沃思高通滤波器(BHPF)定义,对频谱图做巴特沃兹高通滤波,使高频通过而使低频衰减,最后做快速傅里叶逆变换,结果发现滤波后的图像变锐化,比原始图像减少平滑过渡而突出边缘等细节部分;经对比图像后发现,经过高斯低通滤波的图像比经过高斯低通巴特沃思低通频域滤波的图像更平滑。
3.2代码及图像
%高斯低通频域滤波
I=imread('f:\lena.jpg');
subplot(1,2,1),imshow(I),title('原始图像');
I=double(I);
S=fftshift(fft2(I));
[M,N]=size(S);
n=2;
d0=30; %GLPF滤波,d0=5,15,30(程序中以d0=30为例)
n1=floor(M/2);
n2=floor(N/2);
for i=1:M
for j=1:N
d=sqrt((i-n1)^2+(j-n2)^2);
h=1*exp(-1/2*(d^2/d0^2));
S(i,j)=h*S(i,j);
end
end
S=ifftshift(S);
S=uint8(real(ifft2(S)));
subplot(1,2,2),imshow(S),title('高斯低通滤波图像');
%巴特沃斯低通频域滤波
I=imread('f:\lena.jpg');
subplot(1,2,1),imshow(I),title('原始图像');
F=double(I); % 数据类型转换,MATLAB不支持图像的无符号整型的计算
G=fft2(F); % 傅立叶变换
G=fftshift(G); % 转换数据矩阵
[M,N]=size(G);
nn=2; % 二阶巴特沃斯(Butterworth)低通滤波器
d0=30; %截止频率为30
m=fix(M/2); n=fix(N/2);
for i=1:M
for j=1:N
d=sqrt((i-m)^2+(j-n)^2);
h=1/(1+0.414*(d/d0)^(2*nn)); % 计算低通滤波器传递函数
result(i,j)=h*G(i,j);
end
end
result=ifftshift(result);
Y2=ifft2(result);
Y3=uint8(real(Y2));
subplot(1,2,2),imshow(Y3),title('巴特沃斯低通滤波')
%巴特沃斯高通频域滤波
I=imread('f:\test.jpg');
subplot(121),imshow(I); title('原始图像');
F=double(I);% 数据类型转换,MATLAB不支持图像的无符号整型的计算
G=fft2(F);% 傅立叶变换
G=fftshift(G);%转换数据矩阵
[M,N]=size(G);
nn=2;% 二阶巴特沃斯(Butterworth)高通滤波器
d0=30;
m=fix(M/2);n=fix(N/2);
for i=1:M
for j=1:N
d=sqrt((i-m)^2+(j-n)^2);
if (d==0)
h=0;
else
h=1/(1+0.414*(d0/d)^(2*nn));% 计算传递函数
end
result(i,j)=h*G(i,j);
end
end
result=ifftshift(result);
J2=ifft2(result);
J3=uint8(real(J2));
subplot(122),imshow(J3); title('巴特沃斯高通滤波后图像'); % 滤波后图像显示