前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >opencv中滤波函数的介绍和应用

opencv中滤波函数的介绍和应用

作者头像
zls365
发布2020-08-19 15:00:33
1.3K0
发布2020-08-19 15:00:33
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全

滤波作用 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪 声(包括高斯噪声、椒盐、噪声、随机噪声等)进行抑制,是图像预 处理中不可缺少的操作,其处理效果的好坏将直接影响到到后续图 像处理和分析的有效性和可靠性。 对不同的噪声的抑制,需要使用不同的滤波进行处理,这边主要 介绍几种滤波方法。

中值滤波: 中值滤波法是一种非线性平滑技术。它是基于排序统计理论的一种能 有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像 或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的 像 素 值 接 近 的 真 实 值 , 从 而 消 除 孤 立 的 噪 声 点 。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; } } } 效果:

  1. 均值滤波 均值滤波是典型的线性滤波算法。值滤波也称为线性滤波,其采用 的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的 各个像素值,即对待处理的当前像素点(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 左图为输入图像,右图为中值滤波输出图像 均值滤波对图像产生模糊的效果。

  1. 高斯滤波 高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的 减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值, 都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模 板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度 值去替代模板中心像素点的值。 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 左图为输入图像,右图为高斯滤波输出图像 由于正态分布又称高斯分布,所以这项技术就叫做高斯模糊。

  1. 双边滤波 双边滤波(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 左图为输入图像,右图为进行双边滤波后的图像 双边滤波效果类似于相机磨皮处理。

  1. 方框滤波 方框滤波属于线性滤波的一种,主要对图像进行模糊操作。 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 左图为输入图像,右图为经过方框滤波输出图像

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档