MATLAB图像处理——图像中余弦噪声去除(附代码)

问题描述

有以下增加噪声后的图像:
请添加图片描述
从图上可以明显看出在x方向上叠加了一正弦规律变化的噪声,要对其进行去噪处理,比较简单的做法的映射到频域,观察噪声出现的位置,在频域进行滤波,最后再进行反傅里叶变化。

傅里叶变化

对原图进行傅里叶变换得到:
在这里插入图片描述
从上面的图中不太能看的出来,将其映射到x方向上,得到一维的分布得到:
在这里插入图片描述
可以看出存在三个尖峰,最中间的尖峰是有用信息,使我们需要保留的,旁边的两个尖峰都是噪声形成的,所以可以使用带阻滤波器将两个尖峰噪声进行滤除。

带阻滤波器

构造的两个带阻滤波器如下图所示,分别过滤掉峰值为120和138处的噪声。
使用带阻滤波器与傅里叶频谱图的投影相乘,其中带阻滤波器值的范围是0~1,越黑代表越接近0,越亮代表越接近1。

在这里插入图片描述

滤波

使用上述滤波器对傅里叶变换得到频谱进行滤波,并在x方向上进行可视化得到:
在这里插入图片描述
可以看出峰值为120和138处的噪声都已被过滤掉。

结果

将其再进行傅里叶反变换得到:
在这里插入图片描述
可以看出,经过傅里叶反变换之后得到的图像,有一些图片的失真,其原因可能是将图像的频谱图从二维降维成一维的操作,在一些没有噪声的地方,也进行了滤波操作,所以会有一定的信息损失。如果在全局信息上,也就是在二维信息上进行去噪应该能够得到更好的效果。

改进

对图中方框区域进行精细化滤波应该会得到更好的效果。
请添加图片描述

代码

close all
f=imread('grid.bmp');
[M,N,~] = size(f); %f为含噪图像
F = fftshift(fft2(f)); % 图像频域
figure;plot(abs(F(M/2+1,:))); % x方向横截线
% 构造n阶巴特沃兹陷波器,可以修改D0和n获得更好的效果。
u = 0:(M-1);
v = 0:(N-1);
[V,U] = meshgrid(v,u);
D0 = 7;
n = 1;
v0 = 120;
v1 = 138;
D1 = abs(V-v0);
D2 = abs(V-v1);
H = 1./(1+(D0^2./(D1.*D2)).^n);
figure;imshow(H,[])
% 滤波
G = fftshift(F.*H);
figure;plot(abs(F.*H(M/2+1,:))); % x方向横截线
g = real(ifft2(G));

figure;
subplot(121); imshow(f,[]);
subplot(122),imshow(g,[]);

猜你喜欢

转载自blog.csdn.net/qq_40608730/article/details/122728519