首页 > 其他分享 >OpenCV_图像的平滑处理详解

OpenCV_图像的平滑处理详解

时间:2024-09-25 09:22:17浏览次数:9  
标签:滤波器 高斯 平滑 滤波 像素 OpenCV 详解 图像

图像平滑处理是图像处理中的一种技术,旨在减少图像中的噪声和细节,从而使图像看起来更平滑。平滑处理可以帮助改善图像质量,去除噪声,并在进一步的图像分析和处理步骤中提供更清晰的数据。常见的平滑处理技术包括滤波、模糊等。例如,下图1是含有噪声的图像,在图像内存在噪声信息,我们通常会通过图像平滑处理等方式去除这些噪声信息。

 比如:以一个像素为核心,其周围像素可以组成一个n1行n1列(简称n1 x n2)的矩阵,这样的矩阵结构在滤波操作中被称为“滤波核”。矩阵的行、列数,决定了滤波核的大小。如下图所示的滤波核大小为3x3,包含9个像素。

在OpenCV中,经常用到的二维图像平滑处理有以下4种:均值滤波、中值滤波、高斯滤波和双边滤波。本节我们一起看一下,用C++调用OpenCV接口,如何实现对图像的平滑处理。

滤波器类型用途
均值滤波降低高斯白噪声
中值滤波降低椒盐噪声
高斯滤波降低图像噪声
双边滤波降低图像噪声、同时保护图像边界信息

目标

在本教程中,您将学习如何使用多种线性滤镜来平滑使用OpenCV功能的图像,如:

理论

注意

下面的解释属于计算机视觉: Richard Szeliski和LearningOpenCV的算法和应用

  • 平滑,也称为模糊,是一种简单而经常使用的图像处理操作。
  • 平滑的原因很多。在本教程中,我们将专注于平滑以减少噪音(其他用途将在以下教程中看到)。
  • 要执行平滑操作,我们将对我们的图像应用过滤器。最常见的滤波器类型是线性的,其中输出像素的值(i.e. g(i,j)),被确定为输入像素值的加权和 (i.e. f(i+k,j+l)) :

OpenCV平滑图像

被称为内核,它只不过是滤波器的系数。h(k,l)

它有助于将过滤器可视化为跨越图像滑动的系数窗口。

  • 有很多种过滤器,这里我们将提到最常用的:

归一化框过滤器

  • 这个过滤器是最简单的!每个输出像素是其内核邻居的均值(均为相等权重)
  • 内核如下:

OpenCV平滑图像

高斯滤波器

  • 可能是最有用的过滤器(虽然不是最快的)。高斯滤波是通过将输入数组中的每个点与高斯核进行卷积来完成的,然后将它们相加以产生输出数组。
  • 只是为了使图片更清晰,记住一维高斯内核的样子?

OpenCV平滑图像

假设图像为1D,您可以注意到位于中间的像素将具有最大的权重。其邻居的权重随着它们与中心像素之间的空间距离的增加而减小。

注意

请记住,2D高斯可以表示为:

OpenCV平滑图像

其中是平均值(峰值),\ sigma表示方差(每个变量x和y)μσXÿ

中值滤波器

中值滤波器遍历信号的每个元素(在这种情况下为图像),并用其相邻像素的中位数(位于估计像素周围的正方形邻域)中替换每个像素。

双边过滤器

  • 到目前为止,我们已经解释了一些过滤器,其主要目标是平滑输入图像。然而,有时过滤器不仅可以消除噪音,还可以使边缘平滑。为了避免这种情况(至少在一定程度上),我们可以使用双边筛选器。
  • 以与高斯滤波器类似的方式,双边滤波器也考虑相邻像素,其权重分配给它们。这些权重具有两个分量,其中第一个是高斯滤波器使用的相同加权。第二个组件考虑了相邻像素与被评估的像素之间的强度差异。
  • 有关更详细的说明,您可以查看此链接

均值滤波(blur)

均值滤波器是一种典型的线性滤波算法,可以把图像中的每一个像素当成滤波核的核心,然后计算核内所有像素的平均值,最后将核心像素值改成平均值。

(89 + 134 + 206 + 198 + 24 + 140 + 154 + 199 + 89) / (3 x 3) = 137

 滤波核大小是3 x 3,核心像素值是24,与周围像素值相比偏小,所以可以认为核心像素值是噪声。先将滤波核中的所有像素值相加,然后除以像素个数,就得出了平均值137。最后将核心像素值改成137,其颜色与周围像素颜色差别就不大了,图像看起来就变得平滑了。这就是均值滤波器降噪的原理。

函数:

C++调用OpenCV实现均值滤波的关键函数原型:

void blur( InputArray src, OutputArray dst,
           Size ksize, Point anchor = Point(-1,-1),
           int borderType = BORDER_DEFAULT 
);

参数说明:
参数1:被处理的图像
参数2:均值滤波处理之后的图像
参数3:滤波核大小,其格式为(高度,宽度),建议使用(3,3),(5,5),(7,7)等 
       宽、高相等的奇数边长。滤波核越大,处理之后的图像越模糊
参数4:滤波核的锚点,建议采用默认值,可以自动计算锚点
参数5:边界样式,建议采用默认值

代码如下:

void QuickDemo::nineth(Mat image) {
	Mat Blur, gauBlur, biBlur;
	blur(image, Blur, Size(5, 5), Point(-1, -1));
	namedWindow("Blur", WINDOW_AUTOSIZE);
	imshow("Blur", Blur);
}

均值滤波器的主要作用是减少图像噪声。当图像中有高斯白噪声时,均值滤波器就可以降低该噪声,因为它可以在像素的相邻像素区域之间取平均值,所以零均值的白噪声将会被抑制。均值滤波器在减少白噪声方面做得比较好。

 

中值滤波(medianBlur)

二维的中指滤波器原理与均值滤波器类似,不同的地方是不计算滤波核内像素的平均值,而是将所有像素值排序,然后把核心像素值,改成最中间的像素值。整个过程会将图像中的每个像素,以其滤波尺寸大小的邻域内像素强度的中值来替代。

24 89 89 134 140 154 198 199 206

函数:

C++调用OpenCV实现中值滤波的关键函数原型:

 

void medianBlur( InputArray src, OutputArray dst, int ksize );

参数说明:
参数1:待处理的图像
参数2:中值滤波处理后的图像
参数3:滤波核大小,其值表示边长,必须是大于1的奇数 3,5,7等

代码如下:

void QuickDemo::nineth(Mat image) {
	Mat Blur, medBlur,gauBlur, biBlur;
	medianBlur(image, medBlur, 5);
	namedWindow("medianBlur", WINDOW_AUTOSIZE);
	imshow("medianBlur", medBlur);
}

中值滤波器有利于去除椒盐噪声。椒盐噪声通常是在获取图像时,突然出现的扰动造成的,一般在图像中以黑白像素的形式出现。

高斯滤波(GaussianBlur)

高斯滤波器是均值滤波器的修正版本,它将正态分布应用于图像处理中。滤波器中心位置的权重最高,越远离核心的像素权重越低,从中心点向外呈正态分布。像素权重不同不能取平均值,要从权重高的像素中取较多的信息,从权重低的像素中取较少的信息。其权重如下图所示:

高斯滤波的计算过程,涉及到卷积运算,会有一个与滤波核大小相同的卷积核。我们以3 x 3的滤波核为例,来描述一下计算过程。卷积核中保存的值,就是核所覆盖区域的权重值。卷积核中所有权重值相加,结果为1.

如下图所示的3 x 3卷积核。

高斯滤波的计算过程,就是将滤波核中的像素值,与卷积核进行卷积运算,最后将结束结果赋值给滤波核的核心像素。

 

滤波核中的每个像素值,与卷积核对应位置的权重值相乘,最后计算出9个值:

89 x 0.05 134 x 0.1 206 x 0.05 = 4.45 13.4 10.3
198 x 0.1 24 x 0.4 140 x 0.1 = 19.8 9.6 14
154 x 0.05 199 x 0.1 89 x 0.05 = 7.7 19.9 4.45

 把这9个值累加,四舍五入取整:

4.45 + 13.4 + 10.3 + 19.8 + 9.6 + 14 + 7.7 + 19.9 + 4.45 = 103.6 ≈ 104

 最后得到的这个结果,就是高斯滤波计算结果,滤波核核心像素值,从24改成了104。

函数:

C++调用OpenCV实现高斯滤波的关键函数原型:

void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                   double sigmaX, double sigmaY = 0,
                   int borderType = BORDER_DEFAULT 
);

参数说明:
参数1:待处理的图像
参数2:高斯滤波处理之后的图像
参数3:滤波核的大小,宽高必须是奇数,与均值滤波相同
参数4:卷积核水平方向的标准差,建议填0,会根据滤波核的大小自动计算合适的权重比例
参数5:卷积核垂直方向的标准差,建议填0,会根据滤波核的大小自动计算合适的权重比例
参数6:边界样式,建议使用默认值

代码如下:

void QuickDemo::nineth(Mat image) {
	Mat Blur, medBlur,gauBlur, biBlur;
	GaussianBlur(image, gauBlur, Size(5, 5), 11, 11);
	namedWindow("gauBlur", WINDOW_AUTOSIZE);
	imshow("gauBlur", gauBlur);
}

高斯滤波也被叫做高斯模糊或高斯平滑,是目前应用最广泛的图像平滑处理算法。高斯滤波可以很好地降低图像噪声,同时将保留更多的细节层次,经过处理的图像,呈现“磨砂玻璃”的滤镜效果。

 双边滤波(bilateralFilter)

双边滤波器是一种非线性滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。双边滤波器会自动判断滤波核处于“平坦”区域还是“边缘”区域:如果滤波核处于“平坦”区域,则会使用类似高斯滤波的算法进行滤波;如果滤波核处于“边缘”区域,则加大“边缘”像素的权重,尽可能地让这些像素值保持不变。

函数:

void bilateralFilter( InputArray src, OutputArray dst, int d,
                      double sigmaColor, double sigmaSpace,
                      int borderType = BORDER_DEFAULT 
);

参数说明:
参数1:待处理的图像
参数2:双边滤波处理后的图像
参数3:以当前像素为中心的整个滤波区域的直径。如果d<0,则自动根据sigmaSpace参数 计算得到。该值与保留的边缘信息数量成正比,与方法运行效率成反比
参数4:参与计算的颜色范围,这个值是像素颜色值与周围颜色值的最大差值,只有颜色值 之差小于这个值时,周围的像素才进行滤波计算。值为255时,表示所有颜色都参与计算
参数5:坐标空间的σ(sigma)值,该值越大,参与计算的像素数量就越多
参数6:边界样式,建议默认值

代码如下:

void QuickDemo::nineth(Mat image) {
	Mat Blur, medBlur,gauBlur, biBlur;
	//双边滤波对椒盐噪声有很好的抑制作用
	bilateralFilter(image, biBlur, 15, 110, 5);
	namedWindow("biBlur", WINDOW_AUTOSIZE);
	imshow("biBlur", biBlur);
}

前边介绍的均值滤波、中值滤波和高斯滤波,都会使整幅图像变得平滑,图像中的边界会变得模糊不清。双边滤波与它们不同的地方是,在平滑过程中可以有效保护边界信息。

对比图:

标签:滤波器,高斯,平滑,滤波,像素,OpenCV,详解,图像
From: https://blog.csdn.net/qq_34800671/article/details/142452379

相关文章

  • OpenCV_自定义线性滤波(filter2D)应用详解
    OpenCVfilter2D将图像与内核进行卷积,将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时,该函数根据指定的边界模式插值异常像素值。卷积核本质上是一个固定大小的系数数组,数组中的某个元素被作为锚点(一般是数组的中心)。上面讲了线性滤波的实质就是计算相......
  • Elasticsearch7.7修改network.host IP地址 start启动失败及Elasticsearch7的配置项详
    一、Elasticsearch7.7修改network.hostIP地址start启动失败    使用的是最新的Elasticsearch7.7版本,启动后默认是绑到127.0.0.1上的,这肯定不是我们需要的,所以修改配置文件将network.host配置选改成我们的服务器局域网IP地址。Elasticsearch7.7版本安装后配置文件elastic......
  • 【C++】STL详解之string类
    本次内容大纲:什么是STLSTL(standardtemplatelibaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本原始版本AlexanderStepanov、MengLee在惠普实验室完成的原始版本,本着开源精神,他们声明允许任......
  • 值传递、引用传递、指针传递【函数的参数传递】详解
    形参变量:形参变量是功能函数里的变量,只有在被调用的时候才分配内存单元,调用结束后立即释放。所以形参只在函数内部有效。实参变量:实参可以是常量,变量,表达式,函数等等,但无论是何类型,在进行函数调用是,他们必须有确定的值,以便把这些值拷贝给形参。值传递、引用传递和指针传递......
  • PasteForm最佳CRUD实践,实际案例PasteTemplate详解(一)
    本文将介绍soft.pastecode.cn出品的PasteForm,PasteForm是贴代码使用Dto思想实现的CRUD的一个组件,或者说输出一个思想!为啥我觉得是最佳的CRUD呢?先结合你的实际项目解答下以下问题:1.如果有一个系统,有100个表,你的管理端需要多少页面?别和我说100个表很多,需求复杂点的随随便便上100个......
  • Linux6.8最新版本x86路径下分页管理源码详解
    x86路径下分页管理源码详解pgtable_64.h分析:pgtable-2level.h分析pgtable-3level.h分析x86的asm文件夹路径为/usr/src/linux-headers-6.8.0-45-generic/arch/x86/include/asm,是x86体系架构下的文件,本次分析了pgtable_64.h,pgtable-2level.h和pgtable-3level.h......
  • Vue修改全局样式 v-style指令详解
    Vue修改全局样式v-style指令详解基本概念与作用基础用法示例一:动态修改单个元素的样式示例二:使用计算属性动态设置样式示例三:全局样式动态化示例四:使用Vue生命周期钩子设置样式示例五:通过Vuex管理全局样式实际开发中的使用技巧在Vue.js的开发过程中,有时我们......
  • 基于旗芯微FC4150系列的DMA详解
    1.概述DMA的中文名称是直接内存访问,它不需要CPU的参与,实现数据传输的技术(但是也会占用总线带宽,所以有时候使用DMA虽然会降低CPU负载,但提高访问数据速度并不高)。1.1旗芯微FC4150系列芯片DMA特征·所有数据的传输都是从源地址写入到目标地址,源地址和目标地址以及传输大小都是......
  • OSPF 默认路由的发布原则 | 类型详解
    默认路由默认路由是指目的地址和掩码都是0的路由。当设备无精确匹配的路由时,就可以通过默认路由进行报文转发。一般多用于网络边界路由器访问互联网所需要的一条路由。同时,企业内,在精确的内部路由基础上,边界路由器通告一条默认路由,使所有访问未知目的地的数据报文都送至......
  • 详解Linux中cat命令
    在Linux命令的世界中,cat命令就像是一位多才多艺的艺术家,它能够将文本文件的美妙旋律编织在一起,或者单独演奏它们的每一个音符。下面,让我们以一种充满情感的方式,用Markdown格式来探索cat命令的多种用途。1. 查看文件的诗篇当你想要阅读一个文件,就像阅读一首诗一样,你可以使用......