代码解释
本文通过对图像加入高频高斯噪声再通过低通滤波滤除噪声。
本文代码通过MATLAB2020a编写。
代码
clear;
clc;
I = imread("person_resize.jpg"); % 读入图像
I = rgb2gray(I); % 转化为灰度图
I = im2double(I);% 读取的图像矩阵数值类型转化为双精度型
[R,C] = size(I); % 取图像的行与列
%% 生成高频高斯噪声(Gauss noise and High pass filter)
gauss_noise = randn(R,C); % 生成高斯噪声
F_gauss = fft2(gauss_noise); % 对高斯噪声进行傅里叶变换
Fs_gauss = fftshift(F_gauss); % 频域移动
[x,y] = meshgrid(-C/2:C/2-1,-R/2:R/2-1); % 生成频域网格
z = sqrt(x.^2 + y.^2); % 频域中心距离
D = 200; %截至频率
n = 4; % 滤波器阶次
H = 1./(1+(D./z).^(2*n));% 巴特沃斯高通滤波器
K = Fs_gauss .* H; % 频域滤波
Ks = ifftshift(K); % 频域移动
L = ifft2(Ks); % 傅里叶反变换
figure(1) % 画图
subplot(2,1,1)% 子图
imshow(real(Fs_gauss))
title("高斯噪声高通滤波前频谱图") % 子图题目
subplot(2,1,2)% 子图
imshow(real(K))
title("高斯噪声高通滤波后频谱图")% 子图题目
%% 向图像加入噪声
I_noise = I + L; %加入噪声
% 加噪后的图像的频谱图
F_I_noise = fft2(I_noise); % 傅里叶变换
Fs_I_noise = fftshift(F_I_noise);% 频谱平移
figure(3)
imshow(real(Fs_I_noise))
title("加噪后的图像的频谱图")
%% 对带噪声图像低通滤波 (Butterworth filter)
H = 1./(1+(z/D).^(2*n));% 巴特沃斯低通滤波器
Fs_I_filter_noise = Fs_I_noise.* H; % 滤波
F_I_filter_noise = ifftshift(Fs_I_filter_noise); % 频谱平移
I_filter = ifft2(F_I_filter_noise); % 傅里叶反变换
%% 显示原始图像、加噪声图像、滤波后图像对比
figure(4) % 建立绘图窗口
subplot(1,3,1) % 建立子图
imshow(I) % 显示图像
title("原始图像") % 子图题目
subplot(1,3,2)
imshow(I_noise)
title("加高频高斯噪声后图像")
subplot(1,3,3)
imshow(I_filter)
title("低通滤波后图像")
%% 对比原始图像、加噪声图像、滤波后图像之间的误差
% 原始图像与加噪声图像之间的误差
origin_noise_error = abs(I_noise - I);
mean_origin_noise_error = sum(origin_noise_error, 'all')/(R * C); %图像平均误差
% 原始图像与滤波后图像之间的误差
origin_filter_error = abs(I_filter - I);
mean_origin_filter_error = sum(origin_filter_error, 'all')/(R * C); %图像平均误差
% 加噪声后的图像与滤波后图像之间的误差
noise_filter_error = abs(I_filter - I_noise);
mean_noise_filter_error = sum(noise_filter_error, 'all')/(R * C); %图像平均误差
disp("原始图像与加噪声图像之间的平均误差为:")
mean_origin_noise_error
disp("原始图像与滤波后图像之间的平均误差为:")
mean_origin_filter_error