中值滤波
脉冲噪声图像降噪方法有哪些?
针对脉冲噪声图像降噪问题,线性滤波方法不仅无法有效滤除脉冲噪声,而且往往会导致特征定位不准确、图像模糊。因此,一般采用非线性滤波方法滤除脉冲噪声。传统中值滤波方法是最常见的低密度脉冲噪声滤除方法,其算法简单,而且有效。然而,中值滤波器对噪声图像中每个像素都进行滤波处理,这直接影响了中值滤波器的高密度脉冲噪声滤除性能。此外,当中值滤波器采用小尺度滤波窗口时,则无法有效滤除高密度噪声,降噪结果易出现噪声斑块;采用大尺度滤波窗口时,则无法有效保留图像的细节信息,往往会模糊图像细节信息。为此提出了许多改进的中值滤波方法,比如中心加权中值滤波方法、方向加权中值滤波方法和改进方向中心加权中值滤波方法等。然而,这些滤波方法仍不能有效滤除高密度脉冲噪声,其主要原因在于没有对像素点进行分类,而对所有像素点采用统一的滤波处理方式。鉴于此,基于开关模式的中值滤波方法被提了出来,开关中值滤波方法分为噪声检测和噪声滤除两个部分。在噪声检测阶段,根据脉冲噪声的特点, 设计一个噪声检测算子,把噪声图像中的像素分为噪声像素点和非噪声像素点。在噪声滤除阶段,对被标记为噪声像素点的灰度值进行替换,而对非噪声像素点的灰度值不做替换直接输出。因此,开关中值滤波方法在去除噪声的同时能有效保留原有图像的细节信息。为此, 研究者提出了许多不同的噪声检测算子,进一步提高噪声检测的准确率。为有效去除高密度脉冲噪声,自适应开关中值滤波方法和改进开关中值滤波方法等新型开关中值滤波方法被提 了出来。然而这些滤波方法根据噪声密度的高低自适应选择滤波窗口的尺度,却无法在去除高密度噪声的同时有效保留原有图像的基本信息,这是因为对高密度脉冲噪声,采用大尺度滤波窗口,容易模糊图像边缘等细节信息。
为此,又有许多新的滤波方法被提出,比如决策型非局部均值和开关非局部均值滤波方法,以及结 中值和均值算子的线性均-中值滤波方法等。这些滤 波方法却需要根据先验知识设计不同的参数,而且针对高密度噪声仍使用大尺度滤波窗口, 容易模糊图像细节信息,这将降低其滤波性能。为此,还有一些新的滤波方法也被提了出来, 比如改进中值滤波方法、梯度滤波方法、偏微分方程滤波方法和剪切波滤波方法等。
中值滤波原理
言归正传,我们先挑一个相对最简单的滤波算法(其实均值滤波更简单,但是它对边缘的保持太差,那就稍微努力点用中值滤波吧)。进行中值滤波不仅可以去除孤点噪声,而且可以保持图像的边缘特性,不会使图像产生显著的模糊,比较适合于实验中的人脸图像。
简单阐述下中值滤波算法与均值滤波的区别如下:
(1)均值滤波相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能力。
(2)中值滤波的有点事可以很好的过滤椒盐噪声,缺点是容易造成图像的不连续。
这里抠取Bingo在网上找到中值滤波与均值滤波的对比效果,由于版权,尊重原创,感谢博主,转载必注:
http://www.360doc.com/content/13/0124/16/10086564_262170551.shtml
图1为含有椒盐噪声的Lena,图2为均值滤波后的Lena,可见效果并不明朗!!!图3为中值滤波后的Lena,世界竟然可以如此的精彩!!!因此设计实现中值滤波势在必行,快马加鞭啊!!!(不认识Lena美女的可以去查看下网上关于Lena的起源,本教程配套资料中也有Lena的全图,敬请欣赏。)
中值滤波算法可以形象的用上述表格来描述,即对于每个3*3的阵列而言,中间像素的值,用这9个值的中值去代替。即只要求得3*3像素阵列的中间值即可,这样就有效的移除了最大值与最小值,图像会变得均匀,对椒盐噪声有很好的滤除效果!
算法的理论很简单,对于C处理器而言,一幅640*480图像的均值滤波,可以很方便的通过数组获得3*3的阵列,但对于我们的Verilog HDL而言,着实不易,一开始想都想不明白!!!
中值滤波matlab
1.函数句柄的创建
函数句柄(function handle)是MATLAB中的一类特殊的数据结构,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。
MATLAB中的函数句柄在调用时和普通函数没有任何区别,下面展示几种创建函数句柄的方式,最后通过函数句柄调用sin(pi)。
% 函数句柄的创建% 方式1 : 直接加@% 语法:@函数名fun1 = @sin;% 方式2 : str2func函数% 语法:str2fun(&39;)fun2 = str2func(&39;);% 方式3 : 匿名函数% 语法:@(参数列表)单行表达式fun3 = @(x, y)x.^2 + y.^2; % 函数句柄的调用fun1(pi);
2.将函数句柄作为函数参数
函数对象的经典应用情境之一就是排序(Sorting),即为一列未知类型的数组提供自定义的排序规则。下面我将实现一个函数super_sort,接收两个参数,第一个参数为待排序的数组,第二个参数是一个对原始数据的变换函数。super_sort能够对原始数据按照变换后的结果进行排序,并返回排好序的原始数据。
%文件名:super_sort.mfunction sorted = super_sort(arr, fh)transformed = fh(arr);% 对原始数组进行变换[~, index] = sort(transformed); % 获得排序后的原数组位置索引sorted = arr(index); % 返回排序后的原数组end
测试脚本:
arr = round(randn(8, 1) * 10);super_sort(arr, @abs)
% 将arr按照其绝对值大小排序super_sort(arr, @sin)
% 将arr按照sin(x)的结果排序
注意,与Perl或Python不同,这里提供的函数句柄并不用于元素间的比较,而是用于将数组内各个元素进行映射成待比较的值。
3.利用函数句柄进行画图
借助函数句柄,可以方便地画出各类函数的图像,这类绘图函数往往以ez开头,下面我将演示ezplot, ezsurf两个函数。
% ezplot画sin函数在[0, 2 * pi]内的曲线ezplot(@sin, [0, 2 * pi]);
% ezplot利用x和y上的参数方程画心形线xfun = @(t)3*(2*cos(t)-cos(2*t));yfun = @(t)3*(2*sin(t)-sin(2*t));ezplot(xfun, yfun);
% ezsurf画二次曲面fun3 = @(x,y)x.^2+y.^2;ezsurf(fun3, [-2, 2, -2, 2]);
4.利用函数句柄进行图像的滤波
MATLAB提供了colfilt这一函数,该函数能将图像分成独立的子块(局部处理),或者相互交叠的窗口(可实现二维卷积及中值滤波),并利用传入的函数句柄对各个子块进行处理。
函数原型为B = colfilt(A,[M N],BLOCK_TYPE,FUN),其中B是输出图像,A是输入图像,[M N]是图像块或窗口的长宽,BLOCK_TYPE参数决定是进行块处理还是窗口滑动处理,FUN就是处理用的函数句柄,它只接收一个矩阵参数,这个矩阵的每一列都是拉长为列向量的子图像,FUN一次可能要处理多个子图像。