一、使用函数fft2,fftshift,ifft2实现一幅灰度图像(lena.bmp)从空域变换到频域,再变换到空域。
核心代码:
matlab代码
%使用函数fft2,fftshift,ifft2实现一幅灰度图像(lena.bmp)从空域变换到频域,再变换到空域。
Image=imread('D:\课程\数字图像处理\实验\image\lena.jpg');
grayI=rgb2gray(Image);%将图片转化成灰度图
DFTI1=fft2(grayI);%对灰度图像进行离散傅里叶变换
DFTI2=fftshift(DFTI1);
IDFTI1=uint8(abs(ifft2(ifftshift(DFTI2))));
% %构造原频谱图,因为离散傅里叶变换生成的频谱图不好看
% ADFTI1=abs(DFTI1);%取绝对值
% top=max(ADFTI1(:));%取最大值
% bottom=min(ADFTI1(:));%取最小值
% ADFTI1=(ADFTI1-bottom)/(top-bottom)*100;%先映射到0-1,再乘以100实现映射到0-100
%
% ADFTI2=fftshift(ADFTI1);%对归一化处理以后的频谱图进行中心化,形成中心化频谱图
%
% IADFTI1=uint8(abs(ifft2(ifftshift(ADFTI2))));
subplot(2,2,1),imshow(Image);title('原图');
subplot(2,2,2),imshow(DFTI1),title('原频谱图');
subplot(2,2,3),imshow(DFTI2),title('中心化频谱图');
subplot(2,2,4),imshow(IDFTI1);title('频域->空域');
运行结果:
实验中没有对频域进行归一化,因为归一化的频域逆变换之后得不到原图。
二、理想低通滤波、理想高通滤波、巴特沃斯低通滤波、巴特沃斯高通滤波、高斯低通滤波、高斯高通滤波
%自编函数hpfilter(),lpfilter()实现理想低通(高通)滤波器、巴特沃斯低通
%(高通)滤波器、高斯低通(高通)滤波器实现对lena.bmp进行低通和高通滤波处理,
%并对实验结果进行分析。
%理想低通滤波器
Image=imread('D:\课程\数字图像处理\实验\image\lena.jpg');
grayI=rgb2gray(Image);
DFTI=fftshift(fft2(double(grayI)));
subplot(2,3,1);imshow(grayI);title('原图');
[N,M]=size(DFTI);
r1=floor(N/2);
r2=floor(M/2);
d0=[5,11,45,68];
for i=1:4
g=zeros(N,M);
for x=1:N
for y=1:M
d=sqrt((x-r1)^2+(y-r2)^2);
if d<=d0(i)
h=1;
else
h=0;
end
g(x,y)=h*DFTI(x,y);
end
end
if i==1
subplot(2,3,2);imshow(g);title('傅里叶频谱');
end
g=uint8(real(ifft2(ifftshift(g))));
subplot(2,3,i+2);imshow(g);title(['理想低通滤波D0= ',num2str(d0(i))]);
end
%理想高通滤波器
Image=imread('D:\课程\数字图像处理\实验\image\lena.jpg');
grayI=rgb2gray(Image);
DFTI=fftshift(fft2(double(grayI)));
subplot(2,3,1);imshow(grayI);title('原图');
[N,M]=size(DFTI);
r1=floor(N/2);
r2=floor(M/2);
d0=[5,11,45,68];
for i=1:4
g=zeros(N,M);
for x=1:N
for y=1:M
d=sqrt((x-r1)^2+(y-r2)^2);
if d<=d0(i)
h=0;
else
h=1;
end
g(x,y)=h*DFTI(x,y);
end
end
if i==1
subplot(2,3,2);imshow(g);title('傅里叶频谱');
end
g=uint8(real(ifft2(ifftshift(g))));
subplot(2,3,i+2);imshow(g);title(['理想低通滤波D0= ',num2str(d0(i))]);
end
%巴特沃斯低通滤波器
Image=imread('D:\课程\数字图像处理\实验\image\lena.jpg');
Image=rgb2gray(Image);
Image=imnoise(Image,'gaussian');
DFTI=fftshift(fft2(double(Image)));
[N,M]=size(DFTI);
r1=floor(N/2);
r2=floor(M/2);
D0=30;
n=[1,2,3,4];
subplot(2,3,1);imshow(Image);title('高斯噪声图像');
for i=1:4
g=zeros(N,M);
for x=1:N
for y=1:M
d=sqrt((x-r1)^2+(y-r2)^2);
h=1/(1+(d/D0)^(2*n(i)));
g(x,y)=h*DFTI(x,y);
end
end
if i==1
subplot(2,3,2);imshow(g);title('傅里叶频谱');
end
g=uint8(real(ifft2(ifftshift(g))));
subplot(2,3,i+2);imshow(g);title(['n=',num2str(n(i)),',D0=30']);
end
%巴特沃斯高通滤波器
Image=imread('D:\课程\数字图像处理\实验\image\lena.jpg');
Image=rgb2gray(Image);
Image=imnoise(Image,'gaussian');
DFTI=fftshift(fft2(double(Image)));
[N,M]=size(DFTI);
r1=floor(N/2);
r2=floor(M/2);
D0=30;
n=[1,2,3,4];
subplot(2,3,1);imshow(Image);title('高斯噪声图像');
for i=1:4
g=zeros(N,M);
for x=1:N
for y=1:M
d=sqrt((x-r1)^2+(y-r2)^2);
h=1/(1+(d/D0)^(2*n(i)));
h=1-h;
g(x,y)=h*DFTI(x,y);
end
end
if i==1
subplot(2,3,2);imshow(g);title('傅里叶频谱');
end
g=uint8(real(ifft2(ifftshift(g))));
subplot(2,3,i+2);imshow(g);title(['n=',num2str(n(i)),',D0=30']);
end
%高斯低通滤波器
Image=imread('D:\课程\数字图像处理\实验\image\lena.jpg');
Image=rgb2gray(Image);
Image=imnoise(Image,'gaussian');
DFTI=fftshift(fft2(double(Image)));
[N,M]=size(DFTI);
r1=floor(N/2);
r2=floor(M/2);
D0=[20,40];
subplot(2,2,1);imshow(Image);title('高斯噪声图像');
for i=1:2
g=zeros(N,M);
for x=1:N
for y=1:M
d=sqrt((x-r1)^2+(y-r2)^2);
h=exp(-0.5*(d/D0(i))^2);
g(x,y)=h*DFTI(x,y);
end
end
if i==1
subplot(2,2,2);imshow(g);title('傅里叶频谱');
end
g=uint8(real(ifft2(ifftshift(g))));
subplot(2,2,i+2);imshow(g);title(['n=2,D0=',num2str(D0(i))]);
end
%高斯高通滤波器
Image=imread('D:\课程\数字图像处理\实验\image\lena.jpg');
Image=rgb2gray(Image);
Image=imnoise(Image,'gaussian');
DFTI=fftshift(fft2(double(Image)));
[N,M]=size(DFTI);
r1=floor(N/2);
r2=floor(M/2);
D0=[20,40];
subplot(2,2,1);imshow(Image);title('高斯噪声图像');
for i=1:2
g=zeros(N,M);
for x=1:N
for y=1:M
d=sqrt((x-r1)^2+(y-r2)^2);
h=exp(-0.5*(d/D0(i))^2);
h=1-h;
g(x,y)=h*DFTI(x,y);
end
end
if i==1
subplot(2,2,2);imshow(g);title('傅里叶频谱');
end
g=uint8(real(ifft2(ifftshift(g))));
subplot(2,2,i+2);imshow(g);title(['n=2,D0=',num2str(D0(i))]);
end
运行结果及分析
2.1 理想低通滤波
核心代码:
分别对频域信息进行半径等于5、11、45、68的低通滤波
实验结果:
随着半径逐渐增大,低通滤波图片的清晰度也逐渐变高,这是因为半径越大,就可以保留更多的边缘、细节、纹理等信息,图片也就越来越清晰。
2.2 理想高通滤波
核心代码:
分别对频域信息进行半径等于5、11、45、68的低通滤波
实验结果:
可以看到,高频信息保留的是图片的边缘、细节、纹理等信息,且随着半径的增大,高频信息越来越少,能保留的边缘、细节、纹理等信息也越来越少。
2.3 巴特沃斯低通滤波器
核心代码:
对频域信息进行n=1、2、3、4的低通滤波,n越大,越近似于理想低通滤波。
实验结果:
可以看到,噪声被有效去除,但图像也变得越来越模糊,并且随着阶数n的增加,图像的振铃效应也越来越明显。因为随着n逐渐增大,巴特沃斯滤波的滤波函数越趋近于理想低通滤波函数。
2.4 巴特沃斯高通滤波器
核心代码:
对频域信息进行n=1、2、3、4的低通滤波,n越大,越近似于理想高通滤波。
实验结果:
随着n逐渐增大,频域保留的高频信息越来越少。
2.5 高斯低通滤波
核心代码:
实验结果:
可以看到,高斯低通滤波去除了噪声,但是当D0比较小时,图片会比较模糊。
2.6 高斯高通滤波
核心代码:
实验结果:
可以看到,当D0=20时,可以保留更多的高频信息。
三、傅里叶变换置不同区域系数为0,观察图像输出效果
%打开一幅图像,对其进行DFT变换,并置其不同区域内的系数为零,进行IDFT,观察其输出效果。
Image=imread('D:\课程\数字图像处理\实验\image\lena.jpg');
Image=rgb2gray(Image);
DFTI=fftshift(fft2(double(Image)));
subplot(3,3,1);imshow(Image);title('原图');
subplot(3,3,2);imshow(DFTI);title('傅里叶频谱');
[N,M]=size(Image);
r1=floor(N/2);
r2=floor(M/2);
%置左上角的值为0
DFTI1=DFTI;
DFTI1(1:r1,1:r2)=0;
IDFT1=uint8(real(ifft2(ifftshift(DFTI1))));
subplot(3,3,3);imshow(IDFT1);title('左上角置0');
%置左下角的值为0
DFTI2=DFTI;
DFTI2(r1:N,1:r2)=0;
IDFT2=uint8(real(ifft2(ifftshift(DFTI2))));
subplot(3,3,4);imshow(IDFT2);title('左下角置0');
%置右上角的值为0
DFTI3=DFTI;
DFTI3(1:r1,r2:M)=0;
IDFT3=uint8(real(ifft2(ifftshift(DFTI3))));
subplot(3,3,5);imshow(IDFT3);title('右上角置0');
%置右下角的值为0
DFTI4=DFTI;
DFTI4(r1:N,r2:M)=0;
IDFT4=uint8(real(ifft2(ifftshift(DFTI4))));
subplot(3,3,6);imshow(IDFT4);title('右下角置0');
%置中心的值为0
DFTI5=DFTI;
DFTI5(r1-floor(r1/2):r1+floor(r1/2),r2-floor(r2/2):r2+floor(r2/2))=0;
IDFT5=uint8(real(ifft2(ifftshift(DFTI5))));
subplot(3,3,7);imshow(IDFT5);title('中心置0');
运行结果及分析
以频域的几何中心为准,将频域分成左上角、左下角、右上角、右下角、中心。一共5个区域。分别置每个区域的系数为0,IDFT变换之后查看的图片的效果。
实验结果:
可以看到,不同的区域置0,IDFT变换之后得到的图片是不一样的。
从Lena的脸可以看出,图片的几何特征发生了变换。亮度也有区别。
右下角和中心置0则去除了低频信息,结果图片只有原图的边缘、细节、纹理等信息。
四、离散余弦变换置不同区域系数为0,观察图像输出效果
%打开一幅图像,对其进行DCT变换,并置其不同区域内的系数为零,进行IDCT,观察其输出效果。
Image=imread('D:\课程\数字图像处理\实验\image\lena.jpg');
Image=rgb2gray(Image);
DCTI=dct2(Image);
subplot(2,3,1);imshow(Image);title('原图');
subplot(2,3,2);imshow(DCTI);title('DCT频谱');
[N,M]=size(DCTI);
DCTI_low=zeros(N,M);
DCTI_center=zeros(N,M);
DCTI_high=zeros(N,M);
cf=60;
for x=1:N
for y=1:M
if(y<M-cf && x<(-N/M)*y+N-cf)
DCTI_low(x,y)=0;
DCTI_center(x,y)=DCTI(x,y);
DCTI_high(x,y)=DCTI(x,y);
elseif(y>M-cf&&x>(-N/M)*y+2*N-cf)
DCTI_low(x,y)=DCTI(x,y);
DCTI_center(x,y)=DCTI(x,y);
DCTI_high(x,y)=0;
else
DCTI_low(x,y)=DCTI(x,y);
DCTI_center(x,y)=0;
DCTI_high(x,y)=DCTI(x,y);
end
end
end
%低频系数置为0
IDCTI_low=uint8(abs(idct2(DCTI_low)));
%中频系数置为0
IDCTI_center=uint8(abs(idct2(DCTI_center)));
%高频系数置为0
IDCTI_high=uint8(abs(idct2(DCTI_high)));
subplot(2,3,3);imshow(IDCTI_low);title('低频系数置为0');
subplot(2,3,4);imshow(IDCTI_center);title('中频系数置为0');
subplot(2,3,5);imshow(IDCTI_high);title('高频系数置为0');
运行结果及分析
将频域分成低频、中频、高频。分别将低频系数、中频系数、高频系数置0,进行IDCT变换,查看结果图片。
实验结果:
可以看到,低频系数置0,结果图片只保留原图的边缘、细节、纹理等信息。而中频系数和高频系数置0,图片只是丢掉一些边缘、细节、纹理等信息,并不影响图片的可视化质量。但是中频系数置0和高频系数置0还是有区别:
可以看到中频系数置0得到图片会比高频系数置0得到的图片更模糊。