2.
图像处理效果与对比
为了测试中值滤波的效果,用matlab对Lena图添加了高斯噪声和椒盐噪声,然后用中值滤波进行降噪测试,对比效果。
虽然matlab中有自带的中值滤波器函数,但是推荐使用ordfilt2函数来实现中值滤波,这是因为在做算法开发的时候,matlab中已经写好的函数不方便修改中间过程,这个时候用更基础的函数或者自己写的代码会更方便。比如ordfilt2函数,它的功能就是对二维数组中n个非零值按照从大到小排序,然后可以指定第几个位置的元素作为输出结果。以5×5窗口为例,13就是中间位置,相关代码已附在后面。
先加入椒盐噪声,椒盐噪声是一种颗粒噪声,像胡椒面一样随机分布,因此得名“椒盐噪声”。测试的效果如下图2所示,左边为输入图像,中间为加入椒盐噪声的图像,右边为5×5中值滤波的结果。判断一个滤波器是否优秀,只要看它是否在去除噪声的同时还能保持住边界,从这个角度出发,中值滤波对椒盐噪声的降噪效果还不错,虽然图像被模糊了,但是椒盐噪声去除的很干净。
从上图可以看出,中值滤波用在椒盐噪声上的效果比较好,用在高斯噪声上的效果就很一般了。在实际算法开发的过程中,会根据噪声形态选择适合的滤波器,中值滤波一般用于去除颗粒噪声,在去坏点模块中会选择使用它,而高斯噪声一般选用高斯滤波或者双边滤波来降噪。
close all;
fileName = 'lena';
fmat = '.bmp';
input_raw = imread([fileName, fmat]);
% [m,n,k] = size(input_raw);
src = double(input_raw)/256;
[m,n,k] = size(src);
% figure,imshow(src),title('src');
%% 椒盐噪声
src_noise = imnoise(src, 'salt & pepper', 0.05); % 加入椒盐噪声
% 实现中值滤波的时候使用ordfilt2函数,这个函数统计二维数组中n个非零数值按大到小排序
% 后处于第k个位置的元素作为滤波器的输出
med(:,:,1) = ordfilt2(src_noise(:,:,1),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);
med(:,:,2) = ordfilt2(src_noise(:,:,2),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);
med(:,:,3) = ordfilt2(src_noise(:,:,3),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);
figure,imshow([src,src_noise,med]);
% imwrite([src,src_noise,med],'median_salt.jpg');
%% 高斯噪声
src_noise = imnoise(src, 'gaussian', 0, 0.01); % 加入高斯噪声
% 中值滤波
med(:,:,1) = ordfilt2(src_noise(:,:,1),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);
med(:,:,2) = ordfilt2(src_noise(:,:,2),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);
med(:,:,3) = ordfilt2(src_noise(:,:,3),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);
figure,imshow([src,src_noise,med]);
% imwrite([src,src_noise,med],'median_gaus.jpg');
判断一个滤波器是否优秀,只要看它是否在去除噪声的同时还能保持住边界,从这个角度出发,中值滤波对椒盐噪声的降噪效果还不错,虽然图像被模糊了,但是椒盐噪声去除的很干净。前面的高斯滤波和均值滤波都是线性滤波器,在数字图像处理中,凡是算子(kernel)可以显式的写出来的滤波器,都是线性滤波器,比如高斯算子,sobel算子,拉普拉斯算子等。中值滤波就没有kernel了,简单的画个图,对于一个3×3的窗口,其中值滤波的结果就是窗口内9个数据排序,取中间的那个作为输出,下图中就是取45作为当前窗口的输出。
【定义】
中值滤波
是一种非线性的信号处理方法,所以它是一种非线性滤波器,也是一种统计排序滤波器。它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
【目的】
中值滤波
对孤立的噪声像素即椒盐噪声、脉冲噪声具有良好的滤波效果,可以保持
图像
的边缘特性,不会使
图像
产生显著的模糊。
【基本原理/思想】
中值滤波
是把数字
图像
或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点。举个例子:
【具体操作/流程】
用一个奇数点的移动窗口,并将模板中心
#include "opencv2/highgui.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/opencv.hpp"
int mymedian(int n1,int n2,int n3,int n
input clk , //pixel clk
input reset_p ,
input [7:0] data_in ,
input data_in_valid ,
clear,clc;
car = imread('sport car.pgm');
noise_car = imnoise(car,'salt & pepper',0.02);
[h,w] = size(car);
% zeros padding
new_car1 = zeros(...