图像去噪
去噪就是从信号和图像中去除噪声或不需要的伪影。对于⼤多数⾳频、图像和视频处理设备,去噪是⼀个关键步骤,因为这些设备在信号传输、采集、处理、信号存储或转换过程中容易产⽣噪声。噪声可能会对信号还原、分析和跟踪等后续信 号处理任务产⽣不利影响。
![](https://img-blog.csdnimg.cn/direct/c14c2aa650014bebbc593776656bb321.png)
均值滤波器
均值滤波器就是让每个像素取领域的平均值,⽐如邻域取
3x3
的范围,计算公式为:
![](https://img-blog.csdnimg.cn/direct/ead775ae092347918831c9b8e3a00f43.png)
均值滤波器会将噪声点使⽤领域内的像素来平滑抹除,但是去噪的同时也会导致丢失⼀些细节信息。
⾼斯加权均值滤波器
⾼斯加权均值滤波器是⼀种更⾼级的滤波器,它在计算均值时为每个像素分配不同的权重。这些权重是根据⾼斯函数确定 的,使得靠近中⼼像素的像素具有更⾼的权重。⾼斯滤波器常⽤于图像处理中,因为它能够有效地减少噪声,同时保持图 像的边缘和细节。
此次采⽤的⾼斯加权均值滤波器我们采⽤固定的权重,如下图所⽰:
![](https://img-blog.csdnimg.cn/direct/451bcc5868134ec78278d15ecef08078.png)
使⽤⾼斯加权均值滤波器处理图像的计算公式为:
![](https://img-blog.csdnimg.cn/direct/5d850c5569cd4b3485f8ed4ede546837.png)
中值滤波器
中值滤波是⼀种⾮线性滤波,在处理脉冲噪声以及椒盐噪声时效果极佳,能够有效的保护好图像的边缘信息。中值滤波的 处理思路很简单,取卷积核当中所覆盖像素中的中值作为锚点的像素值即可。
计算公式为:
![](https://img-blog.csdnimg.cn/direct/8149f243eeac4ee6a740df2fbc2834c9.png)
原图和添加了⾼斯噪声和椒盐噪声的图像分别如下:
![](https://img-blog.csdnimg.cn/direct/9292d7970d0e4eb6b508ab03ea20d802.png)
滤波结果
![](https://img-blog.csdnimg.cn/direct/fe5267c79bc24610998f3d559d50520c.png)
%% 图像去噪 %%
% 清理一下工作区
clc
clear all
close all
%% 读入要测试的图像 %%
image = imread('data/img02.jpg');
image_gray = rgb2gray(image); %将彩色图转化为二维的灰度图
image_input = im2double(image_gray); % 转化为标准化数组
% 获取图像的尺寸
[row,col] = size(image_input); %获取图像的像素点个数
%% 对图像加入高斯噪声 %%
image_gussian = imnoise(image_input,'gaussian',0,0.8);
% 对图像加入椒盐噪声
image_salt = imnoise(image_input,'salt & pepper',0.2);
% 显示图像加入高斯噪声和椒盐噪声后的结果
figure;
subplot(1,3,1),imshow(image_input),title('原图');
subplot(1,3,2),imshow(image_gussian),title('加入高斯噪声后');
subplot(1,3,3),imshow(image_salt),title('加入椒盐噪声后');
%% 均值滤波 %%
I1 = image_gussian;
P1 = image_salt;
for i=2:row-1
for j=2:col-1
I1(i,j)=(image_gussian(i,j)+image_gussian(i-1,j)+image_gussian(i+1,j)+image_gussian(i,j-1)+image_gussian(i,j+1)+image_gussian(i-1,j-1)+image_gussian(i-1,j+1)+image_gussian(i+1,j-1)+image_gussian(i+1,j+1))/9;
P1(i,j)=(image_salt(i,j)+image_salt(i-1,j)+image_salt(i+1,j)+image_salt(i,j-1)+image_salt(i,j+1)+image_salt(i-1,j-1)+image_salt(i-1,j+1)+image_salt(i+1,j-1)+image_salt(i+1,j+1))/9;
end
end
%% 高斯加权均值滤波 %%
I2 = image_gussian;
P2 = image_salt;
% for i=2:row-1
% for j=2:col-1
% %
% end
% end
% 高斯加权均值滤波
window_size = 3; % 定义窗口大小
sigma = 1.5; % 定义高斯核的标准差
for i = 2:row-1
for j = 2:col-1
% 提取窗口内的像素值
window = double(I2(i-1:i+1, j-1:j+1));
% 计算高斯加权均值
weights = fspecial('gaussian', window_size, sigma);
weighted_sum = sum(sum(window .* weights));
normalized_weighted_sum = weighted_sum / sum(weights(:));
% 将加权均值赋给当前像素
P2(i, j) = uint8(normalized_weighted_sum);
end
end
%% 中值滤波 %%
I3 = image_gussian;
P3 = image_salt;
% for i=2:row-1
% for j=2:col-1
% %
% end
% end
% 中值滤波
window_size = 5; % 定义窗口大小
for i = 2:row-1
for j = 2:col-1
% 提取窗口内的像素值
window = I3(i-1:i+1, j-1:j+1);
% 将窗口内的像素值展开成一维数组
window_values = window(:);
% 对窗口内的像素值进行排序
sorted_window = sort(window_values);
% 取中值
median_value = sorted_window(floor(numel(sorted_window)/2) + 1);
% 将中值赋给当前像素
P3(i, j) = median_value;
end
end
%% 结果可视化 %%
figure;
subplot(2,3,1),imshow(image_input),title('原图','fontsize',16);
subplot(2,3,2),imshow(image_gussian),title('高斯噪声','fontsize',16);
subplot(2,3,4),imshow(I1),title('均值滤波','fontsize',16);
subplot(2,3,5),imshow(I2),title('高斯加权均值滤波','fontsize',16);
subplot(2,3,6),imshow(I3),title('中值滤波','fontsize',16);
figure;
subplot(2,3,1),imshow(image_input),title('原图','fontsize',16);
subplot(2,3,2),imshow(image_salt),title('椒盐噪声','fontsize',16);
subplot(2,3,4),imshow(P1),title('均值滤波','fontsize',16);
subplot(2,3,5),imshow(P2),title('高斯加权均值滤波','fontsize',16);
subplot(2,3,6),imshow(P3),title('中值滤波','fontsize',16);