针对添加了零均值高斯噪声的图像,以取得尽可能好的处理效果为目的,采用不少于3种方法进行处理;对处理结果进行定性和定量的比较、并得出相应的结论。
采用的图像滤波包括均值滤波,中值滤波和高斯滤波。
图像的均值滤波用于减少图像中的噪声和细节。它的基本原理是用像素周围邻域内像素值的平均值来替代该像素的值。首先需要确定滤波器的大小,即决定用于计算每个像素邻域的大小。滤波器的大小可以是一个正方形或矩形区域,其尺寸通常是奇数。常见的滤波器大小有3x3、5x5等。对于图像中的每个像素,将滤波器放置在该像素周围的邻域内。邻域内的像素值被提取出来,并计算它们的平均值。平均值代表了邻域内像素值的整体特征。将计算得到的平均值作为该像素的新值,用于替代原始像素的值。均值滤波是一种线性滤波方法,它能够有效地平滑图像,减少噪声的影响。在实际应用中,根据需要选择不同大小的滤波器来控制平滑程度。较大的滤波器会更加平滑图像,但可能会导致更多的细节丢失。而较小的滤波器可以保留更多的细节,但可能无法有效地降低噪声水平。因此,在使用均值滤波器时需要根据具体情况进行调整和权衡。
中值滤波是一种非线性滤波方法,它的基本原理是用图像中像素值的中值来替代该像素点的值。选取一个滤波窗口,遍历输入图像的每个像素点,统计滤波窗口内的所有像素值,并将这些像素值排序,用排序后位于中间位置的值(中值)来替代当前像素点的值,可以得到中值滤波后的图像。与均值滤波相比,中值滤波对脉冲噪声和椒盐噪声具有很好的滤除效果。因为中值可以有效剔除像素值离群点的影响,不像均值那样容易受极值影响较大。边缘保持性好,由于中值滤波在统计滤波窗口内像素值时,选取中间值,而不是计算均值,所以它可以很好地保留图像边缘细节,不出现图像模糊的问题。不易产生新的灰度值。中值滤波只选择输入灰度级内已有的值,不会产生新的灰度值,所以它保证了输出图像的自然性。
高斯滤波基于高斯函数的原理,通过对图像中的每个像素点及其周围像素点进行加权平均来实现平滑效果。
高斯函数是一个钟形曲线,具有中心点和标准差两个参数。它的形式如下:
其中,x表示距离中心点的偏移量,σ表示标准差。高斯函数的图像呈钟形曲线,中心点处取得最大值,随着距离中心点的偏移增加,函数值逐渐减小。在高斯滤波中,对于图像中的每个像素点,会将其与周围像素点进行加权平均,权重由高斯函数计算得出。距离中心点越远的像素点,其权重越小,距离中心点越近的像素点,其权重越大。高斯滤波首先要定义一个滤波模板,通常为一个奇数大小的矩阵,例如3x3、5x5等。模板大小决定了滤波的范围。对于图像中的每个像素点,将该点及其邻域像素点与滤波模板进行逐元素乘法。将乘积结果进行加权平均,权重由高斯函数计算得出。最后将加权平均结果赋值给原始像素点,完成平滑处理。高斯滤波可以有效地平滑图像,去除图像中的高频噪声,同时保留图像的主要特征。
1.读取图像:使用imread函数读取了三个图像文件,分别是原始图像lena.bmp,添加了高斯噪声的图像lena_noisy01.jpg,以及另一个添加了高斯噪声的图像lena_noisy02.bmp。
2.转换为灰度图像:对第二个图像进行rgb2gray转换,将其转换为灰度图像,命名为img1。
3.均值滤波:使用imfilter函数和fspecial函数创建一个3x3的平均滤波器,分别对img1和img2进行均值滤波操作。
4.中值滤波:使用medfilt2函数对img1和img2进行中值滤波操作。
5.高斯滤波:使用imgaussfilt函数对img1和img2进行高斯滤波操作。
6.画图比较。
7.计算均方误差:使用mean函数计算原始图像I0与每种滤波结果之间的均方误差。
8.显示MSE结果:使用disp函数显示每种滤波方法对应的MSE结果。
clc;
clear all;
close all;
% 读取图像
I0 = imread('lena.bmp');I1 = imread('lena_noisy01.jpg');
img2 = imread('lena_noisy02.bmp');
img1 = rgb2gray(I1);
% 均值滤波
mean_filtered1 = imfilter(img1, fspecial('average', [3, 3]));
mean_filtered2 = imfilter(img2, fspecial('average', [3, 3]));
% 中值滤波
median_filtered1 = medfilt2(img1);
median_filtered2 = medfilt2(img2);
% 高斯滤波
gaussian_filtered1 = imgaussfilt(img1);
gaussian_filtered2 = imgaussfilt(img2);
% 显示原始图像和处理后的图像
figure;
subplot(2, 2, 1);
imshow(img1);
title('原始图像1');
subplot(2, 2, 2);
imshow(mean_filtered1);
title('均值滤波1');
subplot(2, 2, 3);
title('中值滤波1');
imshow(median_filtered1);
subplot(2, 2, 4);
imshow(gaussian_filtered1);
title('高斯滤波1');
subplot(2, 2, 4);
figure;
subplot(2, 2, 1);
imshow(img2);
title('原始图像2');
subplot(2, 2, 2);
imshow(mean_filtered2);
title('均值滤波2');
subplot(2, 2, 3);
imshow(median_filtered2);
title('中值滤波2');
subplot(2, 2, 4);
imshow(gaussian_filtered1);
title('高斯滤波2');
% 计算MSE
MSE1 = mean((I0 - mean_filtered1).^2, 'all');
MSE2 = mean((I0 - median_filtered1).^2, 'all');
MSE3 = mean((I0 - gaussian_filtered1).^2, 'all');
disp(['均值滤波1的MSE:', num2str(MSE1)]);
disp(['中值滤波1的MSE:', num2str(MSE2)]);
disp(['高斯滤波1的MSE:', num2str(MSE3)]);
MSE4 = mean((I0 - mean_filtered2).^2, 'all');
MSE5 = mean((I0 - median_filtered2).^2, 'all');
MSE6 = mean((I0 - gaussian_filtered2).^2, 'all');
disp(['均值滤波2的MSE:', num2str(MSE4)]);
disp(['中值滤波2的MSE:', num2str(MSE5)]);
disp(['高斯滤波2的MSE:', num2str(MSE6)]);
对于lena_noisy01.jpg图像的处理结果。
对于lena_noisy02.bmp图像的处理结果
定性比较,对于采用的三种滤波处理三种方法,其中通过对于处理结果的观察,均值滤波效果最好。
定量比较,计算未加噪的信号与处理后的信号的均方误差,结果如下:
从结果中可以看出,均值滤波的均方误差数值最小,效果最佳。