1.中值滤波概念
中值滤波法是一种非线性平滑技术,它将每一象素点的灰度值设置为该点某邻域窗口内的所有象素点灰度值的中值。
2.中值滤波模板选择
2.1 一维数列中值滤波
例:
一维中值滤波实例:10 20 5 30 52 40 20 6 50
步骤:
- 选取模板,模板必须为大于3的奇数值,例若模板 m=3
- 从该数列左侧开始,把当前值作为中间元素,给包括自己的相邻3个元素进行排序
- 取3个值的中值替换当前点的值
结果:
一维中值滤波结果:10 10 20 30 40 40 20 20 6
2.2 二维数列中值滤波
同一维中值滤波类似
步骤:
- 选取模板m*m ,m必须为大于3的奇数
- 给m*m个数排序
- 选取中间值代替当前值
3.中值滤波类型
- m*m中值滤波
- 十字形中值滤波
- 最大值中值滤波
- 最小值中值滤波
- 等
只是选取模板有所不同,其余步骤一致,顾名思义就行
4.中值滤波主要特性
- 对大的边缘高度,中值滤波较邻域均值好,对于较小边缘高度,两种滤波有很少的差别
- 中值滤波是非线性的;而平均滤波为加权平均,为线性的
- 在抑制图像随机脉冲噪声方面有效,运算速度快,便于实时处理。
- 去除孤立线或点干扰,而保留空间清晰度较平滑滤波好;但对高斯噪声不如平滑滤波
clear,clc;
pauseTime = 1;
data_path = '..\Set12';
ext = ['*.jpg', '*.png', '*.jpeg'];
filePaths = [];
for i = 1 : length(ext)
filePaths = cat(1,filePaths, dir(fullfile(data_path,ext(i))));
end
noise_leval = [10,15,20,25,30,35,40,45,50,55,60,65,70];
for ii = 1:length(noise_leval)
PSNRs = zeros(1, length(filePaths));
SSIMs = zeros(1, length(filePaths));
sigma = noise_leval(ii);
for jj = 1:length(filePaths)
% 原图像
originImage = im2double(imread(filePaths(jj).name));
% 添加高斯噪声
imageWithNoise = single(originImage + sigma/255*randn(size(originImage)));
[rows, cols] = size(originImage);
y = imageWithNoise;
% 中值滤波算法
% 指定模板尺寸
boxSize = 3;
template = zeros(boxSize);
for i = 1:rows-boxSize+1
for j = 1:cols-boxSize+1
% 取模板内像素
template = imageWithNoise(i:i+(boxSize-1),j:j+(boxSize-1));
% 用中值替换模板中心点像素值
m = median(template(:));
y(i+(boxSize-1)/2,j+(boxSize-1)/2) = m;
end
end
% 计算psnr和ssim
PSNRs(jj) = psnr(im2uint8(originImage), im2uint8(y));
SSIMs(jj) = ssim(im2uint8(originImage), im2uint8(y));
imshow(cat(2,im2uint8(originImage),im2uint8(imageWithNoise),im2uint8(y)));
title(['sigma=',num2str(sigma),' ',filePaths(jj).name,' psnr=',num2str(PSNRs(jj),'%2.2f'),'dB',' ssim=',num2str(SSIMs(jj),'%2.4f')])
drawnow;
pause(pauseTime)
end
disp(['sigma:',sigma,'psnr:',mean(PSNRs),'ssim:', mean(SSIMs)]);
end