傅里叶变换、离散余弦变换、频域滤波

一、使用函数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得到的图片更模糊。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值