matlab进行图像傅里叶变换去噪(fft2、fftshift、ifft2、ifftshift)

在数字图像处理中,去噪是一个经常进行的操作。
除了在空域上进行去噪,比如使用均值滤波、中值滤波等等滤波器外,利用傅里叶变换在频域上进行操作也是一种非常有效的方式。

使用傅里叶变换进行图像去噪的原理如下:
我们知道,图像中的噪声往往代表着图像上灰度值的突变,从而对应着高频部分,而图像中的其他大部分内容则主要集中在低频部分。
因此,通过将空间图像进行傅里叶变换后,转化到频域上,我们可以得到这个图像每个像素的相位和幅度值。
对于相位而言,代表着图像中的位置形状信息,一般情况下我们不对其做处理,否则可能就无法恢复出原始图像的形状。
而幅度值则主要代表着能量的大小,也就是每一个频率上的能量大小。我们只要将高频部分的能量值置为0,就可以去除噪声。
需要注意的是,在进行傅里叶变换(fft2)后,低频部分集中分布在四个角落,通过移位(fftshift)之后,将其集中到图像的中心,这只是为了便于处理。
当我们对幅值进行处理后,再进行反移位(ifftshift)恢复到原始的分布情况,之后结合相位计算出每个像素对应的值。
对其进行傅里叶反变换(ifft)后,就可以恢复出时域图像,此时图像上的噪声就可以去除了。

一个具体例子如下所示:
代码:

clear;
clc;
F = imread('C:\Users\asus1\Desktop\IMG_20170708_090611.jpg');
F1 = rgb2gray(F);
F1 = imnoise(F1,'gaussian',0.1);   %添加噪声
subplot(2,2,1),imshow(F1);
title('噪声图像');

FFT = fft2(F1);
myangle = angle(FFT);             %相位谱(没有进行移位的)
FS = abs(fftshift(FFT));          % 移位,使低频成分集中到图像中心,并得到幅度谱

S = log(1+abs(FS));
subplot(2,2,2),imshow(S,[]);     % 带噪声的幅度图,亮度代表着能量
title('傅里叶变换后幅度图');

% 对幅度图进行操作,去除外围的高频成分的幅度值,也就是将高频成分能量去除了
%(此处只是简单地保留了图像中心 200 X 200 的图像块)
[m,n] = size(FS);
FS(1:m/2-100,:) = 0;
FS(m/2+100:m,:) = 0;
FS(m/2-100:m/2+100,1:n/2-100) = 0;
FS(m/2-100:m/2+100,n/2+100:n) = 0;

SS = log(1+abs(FS));
subplot(2,2,3),imshow(SS,[]);     % 去除外围幅度值后的幅度图,亮度代表着能量
title('去除外围幅值后幅度图');


aaa = ifftshift(FS);          % 将处理后的幅度图反移位,恢复到正常状态
bbb = aaa.*cos(myangle) + aaa.*sin(myangle).*1i;      % 幅度值和相位值重新进行结合,得到复数
fr = abs(ifft2(bbb));               % 进行傅里叶反变换,得到处理后的时域图像
ret = im2uint8(mat2gray(fr));       
subplot(2,2,4),imshow(ret);       %去除高频成分后的图像
在这里插入代码片

运行结果如图所示:
matlab进行图像傅里叶变换去噪(fft2、fftshift、ifft2、ifftshift)_第1张图片
可以发现,在进行频域的滤波之后,图像的噪声明显减少了,因为我们只保留了低频成分的幅值,如图三所示,中心的那一小块。

你可能感兴趣的:(Matlab)