目录
一.中值滤波
同前面所讲的均值滤波相类似,中值滤波也是取当前像素点周围的N x N窗口,取这些值的中值作为当前像素经过滤波后的值。
理论依据
因为邻域的像素具有一定的连续性以及相似性,如果某个像素被添加了噪声,那么这个值一定会偏离原值,在所选取的窗口中呈现异常。将所选取的窗口像素进行排序,这个被添加了噪声的值就会偏大或者偏小,那么选取中值作为滤波后的值就能有效地过滤噪声。
中值滤波示例如下:
(红色为添加噪声像素)

排序方式的选择
这里不选择冒泡排序法,选择并行三步中值法是为了方便此算法用于FPGA中。如果在FPGA中选择冒泡排序法,会浪费很多不必要的时间(具体原因可以查看《基于MATLAB与FPGA的图像数据处理教程》)。
三步并行法
1.首先求出每行的最大值max1,max2,max3,最小值min1,min2,min3和中值mid1,mid2,mid3;
2.然后求这些最大值中的最小值max_min,最小值中的最大值min_max,中值中的中值mid_mid;
3.最后求max_min,min_max,mid_mid中的中值。
二.MATLAB实现
这里以3X3的窗口大小为例,在椒盐噪声下,实现均值滤波(边缘不做处理,等于原值)
Matlab
clc;
clear all;
img = imread('D:matlab file\image_med_filter\yu.bmp');
img = rgb2gray(img);
[h,w] = size(img);
n = 3; %3X3窗口
windows = zeros(n,n);
img_noise = imnoise(img,'salt & pepper',0.01); %椒盐噪声
image = zeros(h,w); %取出一个3X3的窗口矩阵
image1 = zeros(h,w); %取出一个3X3的窗口矩阵
for i = 1 : h
for j = 1 : w
if(i<(n-1)/2+1 || i>h-(n-1)/2 || j<(n-1)/2+1 || j>w-(n-1)/2)
image(i,j) = img_noise(i,j);
image1(i,j) = img_noise(i,j);
else
windows = img_noise(i-(n-1)/2:i+(n-1)/2,j-(n-1)/2:j+(n-1)/2);
% image(i,j) = median(median(windows(i,j)));
% %在matlab里可以直接调用中值函数进行计算,但是为方便在FPGA中进行硬件加速的实现,这里采用3步中值法算出中值
max1 = max(windows(1,1:3)); mid1 = median(windows(1,1:3)); min1 = min(windows(1,1:3));
max2 = max(windows(2,1:3)); mid2 = median(windows(2,1:3)); min2 = min(windows(2,1:3));
max3 = max(windows(3,1:3)); mid3 = median(windows(3,1:3)); min3 = min(windows(3,1:3));
max_min = min([min1,min2,min3]);
mid_mid = median([mid1,mid2,mid3]);
min_max = max([max1,max2,max3]);
image1(i,j) = sum(sum(windows)) / (n*n); %均值滤波
image(i,j) = median([max_min,mid_mid,min_max]); %中值滤波
end
end
end
image = uint8(image);
image1 = uint8(image1);
figure('Position', [500,400, 1600, 500]); %设置figure的大小
subplot(1,4,1);imshow(img);title('原图');
subplot(1,4,2);imshow(img_noise);title('添加椒盐噪声');
subplot(1,4,3);imshow(image);title('中值滤波');
subplot(1,4,4);imshow(image1);title('均值滤波');
上述代码加入了均值滤波进行对比,结果如下:

可以看出,中值滤波能够有效消除椒盐噪声,而均值滤波的效果就没那么明显。
参考自《基于MATLAB与FPGA的图像处理教程》。
内容仅供学习使用,请勿转载。
如有问题,欢迎指正。