滤波作用
图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪
声(包括高斯噪声、椒盐、噪声、随机噪声等)进行抑制,是图像预
处理中不可缺少的操作,其处理效果的好坏将直接影响到到后续图
像处理和分析的有效性和可靠性。
对不同的噪声的抑制,需要使用不同的滤波进行处理,这边主要
介绍几种滤波方法。
中值滤波:
中值滤波法是一种非线性平滑技术。它是基于排序统计理论的一种能
有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像
或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的
像 素 值 接 近 的 真 实 值 , 从 而 消 除 孤 立 的 噪 声 点 。g ( x,y )
=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和
处理后图像。W 为二维模板,通常为 3*3,5*5 区域,也可以是不同的的形
状,如线状,圆形,十字形,圆环形等。
59
中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,
能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不
具有的。此外,中值滤波的算法比较简单,也易于用硬件实现。所以,中
值滤波方法一经提出后,便在数字信号处理领得到重要的应用。
对于去除椒盐噪声的方法,无疑为中值滤波。
v EmguCv 实现方法:
EmguCv 采用 CvInvoke 类调用 MedianBlur 函数进行处理。
public static void MedianBlur(IInputArray src, IOutputArray
dst, int ksize);//采用中值滤波对图像进行处理。
参数解析:
IInputArray src:输入原图像。
IOutputArray dst:输出滤波后的图像(类型,大小与 scr
一致)。
int ksize:滤波算子的孔径大小,这个必须为奇数。
实例:
using Emgu.CV; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { Mat scr = new Mat("Device20200421161432949.jpg", Emgu.CV.CvEnum.LoadImageType.Grayscale); Mat dst = new Mat(); CvInvoke.MedianBlur(scr,dst,9); pictureBox1.Image = scr.Bitmap; pictureBox2.Image = dst.Bitmap; } } }
效果:
- 均值滤波
均值滤波是典型的线性滤波算法。值滤波也称为线性滤波,其采用
的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的
各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板
由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度个 g(x,y),即个 g(x,y)=1/m ∑f(x,y), m 为该模板中包含当前像素在内的像素总个数。均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
EmguCv 实现方法:
EmguCv 采用 CvInvoke 类调用 Blur 函数进行均值滤波处理。
public static void Blur(IInputArray src, IOutputArray dst,
Size ksize, Point anchor, BorderType borderType =
BorderType.Default);//对图像进行均值滤波处理。
参数解析:
IInputArray src:输入原图像。
IOutputArray dst:输出滤波后的图像(类型,大小与
scr 一致)。
Size ksize:内核的大小。
Point anchor:锚点;默认值点(-1,-1)表示在内核中心。
BorderType borderType = BorderType.Default:边界点
的类型。(边界类型,在前面已经介绍)。
62
实现 代码 :
如图 4.15 所示(内核大小为 5*5,锚点在中心):
图 4.15 均值滤波实现代码
实现效果:
如图 5.16 所示。
图 5.16 左图为输入图像,右图为中值滤波输出图像
均值滤波对图像产生模糊的效果。
- 高斯滤波
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的
减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,
都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模
板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度
值去替代模板中心像素点的值。
v EmguCv 实现方法:
EmguCv 采用 CvInvoke 类调用 GaussianBlur 函数进行处理。
63
public static void GaussianBlur(IInputArray src,
IOutputArray dst, Size ksize, double sigmaX, double sigmaY = 0,
BorderType borderType = BorderType.Default);
参数解析:
IInputArray src:待处理图像。
IOutputArray dst:处理后的图像。
Size ksize:高斯内核的大小,其中内核的长宽可以不相等,但
是必须是正奇数,或者为 0,这都是由 sigma 计算出来的。
double sigmaX:表示高斯函数在 X 方向的偏差。
double sigmaY = 0:高斯核标准偏差在 Y 方向;如果 sigmaY 是零,
它 的 值 将 会 和 sigmaX 一 样 , 如 果 两 个 0, 他 们 从 ksize.width 和
ksize.height 计算。分别(见 getGaussianKernel()),为了结果的准确性,
把 Ksize,sigmaX,sigmaY 指定某个值。
BorderType borderType = BorderType.Default:推断出图像外
部像素的某种边界模式。
实现代码:
如图 5.17 所示(高斯滤波)
图 5.17 高斯滤波实现代码
实现效果:
如图 5.18 所示。
图 5.18 左图为输入图像,右图为高斯滤波输出图像
由于正态分布又称高斯分布,所以这项技术就叫做高斯模糊。
- 双边滤波
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近
度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。
具有简单、非迭代、局部的特点。
双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤
波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边
滤波器顾名思义比高斯滤波多了一个高斯方差 sigma-d,它是基于空间分布的高斯滤波函
数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘
附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤
波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。
EmguCv 实现方法:
EmguCv 采用 CvInvoke 类调用 BilateralFilter 函数进行处理。
public static void BilateralFilter(IInputArray src,
IOutputArray dst, int d, double sigmaColor, double sigmaSpace,
BorderType borderType = BorderType.Default);//对图像使用双边滤波
处理。
参数解析:
IInputArray src:原始图像。
65
IOutputArray dst:处理后得到的图像。
int d:表示在过滤的过程中的每个像素邻域的直径。如果为非
正数,它将会从 sigmaSpace 计算得到。
double sigmaColor:颜色空间滤波器的σ值。更大的值的参数
意味着更远的颜色像素邻域内(见 sigmaSpace)将混合在一起,导致更大的
区域 semi-equal 颜色。
double sigmaSpace:坐标空间中滤波器的σ值,越大的值意味着
会影响到越远的像素(只需要他们的颜色接近)。当 d>0,d 指定了邻域大
小且与 sigmaSpace 无关,否则,d 将会与 sigmaSpace 成正比例。
BorderType borderType = BorderType.Default:推断出图像外
部像素的某种边界模式。
实现代码:
如图 5.19 所示。
图 5.19 双边滤波实现代码
实现效果:
如图 5.20 所示。
图 5.20 左图为输入图像,右图为进行双边滤波后的图像
双边滤波效果类似于相机磨皮处理。
- 方框滤波
方框滤波属于线性滤波的一种,主要对图像进行模糊操作。
EmguCv 实现方法:
EmguCv 采用 CvInvoke 类调用 BoxFilter 函数进行处理。
public static void BoxFilter(IInputArray src, IOutputArray dst, DepthType ddepth,
Size ksize, Point anchor, bool normalize = true, BorderType borderType = BorderType.Default);//
对图像进行方框模糊。
参数解析:
IInputArray src:输入图像,原始图像。
IOutputArray dst:输出图像,处理后得到的图像。
DepthType ddepth:输出图像的深度,-1 代表为 scr 图像的深度。
Size ksize:方框滤波内核的大小。
Point anchor:锚点;默认值点(-1,-1)表示在内核中心。
bool normalize = true:表示内部是否进行归一化操作。true,代表进行归一化
操作。默认为 true。
BorderType borderType = BorderType.Default:推断出图像外部像素的某种边界
模式。
实现代码:
如图 5.21 所示。
图 5.21 方框滤波实现代码
实现效果:
如图 5.22 所示。
图 5.22 左图为输入图像,右图为经过方框滤波输出图像