专栏首页CSharp编程大全opencv中滤波函数的介绍和应用

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

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

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

本文分享自微信公众号 - CSharp编程大全(y438679770)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • VS2017中使用QT Chart图表

    有关QtChart的介绍在这就不详谈了,想要具体了解的百度就可以,官网和网站大多数都是介绍如何在QtCreator中使用QtChart,而本文主要介绍如何在vs...

    zls365
  • C#实例:datagridview单元格合并

    这是替C#微信交流群群友做的一个小实例,目的就是在datagridview选择对应行以后,点击button后获取对应行的ip,并执行相应的操作,其实我觉得这样...

    zls365
  • C# 软件版本号

    //build 等于自当地时间 2000 年 1 月 1 日以来的天数 //revision等于自当地时间午夜以来的秒数/2 // 可以指定所有这些值,也可以使...

    zls365
  • OpenCV线性滤波(均值滤波,方框滤波,高斯滤波)

    OpenCV中提供了三种常用的线性滤波函数,它们分别是方框滤波,均值滤波和高斯滤波。

    zy010101
  • Side Window Filtering 论文解读和C++实现

    刚开始看到这篇论文的时候,我就很感兴趣想去复现一把看看效果。这篇论文是今年 CVPR oral 且不是深度学习方向的,其核心贡献点就是:不管原来的滤波器保不保边...

    Ldpe2G
  • 详解图像滤波原理及实现!

    图像的实质是一种二维信号,滤波是信号处理中的一个重要概念。在图像处理中,滤波是一常见的技术,它们的原理非常简单,但是其思想却十分值得借鉴,滤波是很多图像算法的前...

    Datawhale
  • 计算机视觉 OpenCV Android | 图像操作之 统计排序滤波、边缘保留滤波

    上述代码将会生成一个3×3大小的矩形结构元素。 使用该结构元素实现最大值或者最小值滤波的代码如下:

    凌川江雪
  • 基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比

    中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.

    FPGA开源工作室
  • AI 与区块链:两大热门技术,会碰撞出什么样的火花?

    不可否认,AI和区块链是促进创新节奏并且给每一个行业都引入了剧变的两大重要技术。每一项技术都有其自身的技术复杂度以及商业影响,但如果这两个强强联合的话也许会从头...

    华章科技
  • AI 与区块链:两大热门技术,会碰撞出什么样的火花?

    区块链和AI可以说是当今最热门的两个技术方向了。在一般人看来,这两大技术似乎没有什么交叉的地方,因为区块链和AI分别属于是技术谱系的两个极端:一个是在封闭数据平...

    小莹莹

扫码关注云+社区

领取腾讯云代金券