OpenCV4.5.5学习笔记(十):核,线性滤波(方框滤波、均值滤波、高斯滤波),非线性滤波(中值滤波、双边滤波)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

`笔者本科时候有幸接触了OpenCV3.2.0版本的学习,后因考研压力不得不暂时停下学习的脚步,现在考研任务结束了,未来的导师也是从事的该方向,笔者又开始了新一轮的学习。回来发现OpenCV已经出到了4.5.5版本,遂重新下载新版本并决定记录这一学习历程。由于笔者水平有限,可能有错误之处还请诸位大佬多多包涵并烦请指出,让我们一起学习,共同进步。
首先需要说明的是:我是按着毛星云前辈编写的OpenCV3编程入门进行学习的,我会尽力把星云前辈的程序转成符合OpenCV4.5.5版本的。毛星云前辈于2021年12月11日不幸过世,他是我非常敬仰的一位业内大佬,我也是看他的书才开始接触OpenCV。


一、什么是核?

核又被称作滤波器:指的是一种由一幅图像I(x,y)根据像素点x,y附近的区域计算得到的一幅新图像I`(x,y)的算法,通俗来说是一个包含加权系数的窗口,例如:
在这里插入图片描述


二、线性滤波(方框滤波、均值滤波、高斯滤波)

平滑,也称为模糊,是一种简单且经常使用的图像处理操作。
平滑的原因有很多。由于信号或图像的能量大多集中在幅度谱的低频或中频段,而高频段充斥着大量的噪声干扰图像信号,因此要采用滤波器消除噪声干扰。
低通就是模糊,为了执行平滑操作,我们将对图像应用过滤器。常见的过滤器类型是线性的,其中输出像素的值(即G( i , j ))被确定为输入像素值的加权和(即F( i + k , j + l )) :
在这里插入图片描述
h ( k , l ) 就被称为核,无非就是滤波器的系数。

1.方框滤波

方框滤波是最简单的一种线性滤波,每个输出像素是其内核四周的平均值(它们都具有相同的权重),我们可使用boxFiler()函数调用。
在OpenCV官方文档中是这么写的:
代码如下(示例):
void cv::boxFilter (
InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor = Point(-1,-1),
bool normalize = true,
int borderType = BORDER_DEFAULT
)
第一个参数是输入图像,
第二个参数是输出与 src 大小和类型相同的图像,
第三个参数是输出图像深度,
第四个参数是模糊内核大小,
第五个参数是锚点,默认值 Point(-1,-1) 表示锚点位于内核中心,
第六个参数是标志,指定内核是否按其区域进行归一化,
第七个参数是用于推断图像外部像素的边框模式

该函数使用的核:
在这里插入图片描述
如果第六个参数选择了归一化(也就是默认值true),就是我们熟悉的均值滤波。

2.均值滤波

均值滤波输出的图像中每一个像素是核窗口内输入图像对应像素的平均值。
缺点:不能很好的保护图像细节,在图像去噪的同时也破坏了图像中的细节部分,从而使图像变得模糊。
我们可以通过blur()函数来调用,具体可见我的该系列的第三篇文章第三大节“图像模糊blur()”

3.高斯滤波

可能是最有用的过滤器(虽然不是最快的),可以消除高斯噪声,对于抑制服从正态分布的噪声非常有效。高斯滤波是通过将输入数组中的每个点与高斯核进行卷积,然后将它们全部相加以产生输出数组来完成的。
二维高斯函数:
在这里插入图片描述
高斯滤波可以通过gaussianBlur()函数调用。
在OpenCV官方文档中是这么写的:
GMat cv::gapi::gaussianBlur (
const GMat & src,
const Size & ksize,
double sigmaX,
double sigmaY = 0,
int borderType = BORDER_DEFAULT,
const Scalar & borderValue = Scalar(0)
)
第一个参数是输入图像,
第二个参数是高斯核大小,
第三个参数是X 方向的高斯核标准差,
第四个参数是Y方向的高斯核标准差,
第五个参数是像素外推法,
第六个参数是常量边框类型的边框值


三、非线性滤波(中值滤波、双边滤波)

1.中值滤波

中值滤波器遍历信号的每个元素,并将每个像素替换为其相邻像素的中值
该方法在去除脉冲噪声、椒盐噪声的同手又能保留图像边缘细节,缺点是花费的时间是均值滤波的5倍以上。
中值滤波可以通过medianBlur ()函数调用。
在OpenCV官方文档中是这么写的:
void cv::medianBlur (
InputArray src,
OutputArray dst,
int ksize
)
第一个参数是输入图像,
第二个参数是与 src 大小和类型相同的目标数组,
第三个参数是孔径线性尺寸;它必须是奇数且大于 1

2.双边滤波

有时过滤器不仅要消除噪声,还必须要平滑边缘。这种情况(至少在一定程度上),我们可以使用双边滤波器。
与高斯滤波器类似,双边滤波器也考虑相邻像素,并为每个像素分配权重。这些权重有两个分量,第一个分量与高斯滤波器使用的权重相同。第二个组件考虑了相邻像素和评估像素之间的强度差异。
双边滤波可以通过bilateralFilter ()函数调用。
在OpenCV官方文档中是这么写的:
void cv::bilateralFilter (
InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
)
第一个参数是输入图像,
第二个参数是与src大小和类型相同的目标图像,
第三个参数是过滤期间使用的每个像素邻域的直径,
第四个参数是在颜色空间中过滤 sigma。较大的参数值意味着像素邻域内更远的颜色会被混合到一起,
第五个参数是在坐标空间中过滤 sigma。较大的参数值意味着更远的像素将相互影响,
第六个参数是用于推断图像外部像素的边框模式


总结

今天学习了一共五种滤波(三种线性和两种非线性),并且也根据星云前辈的程序运行试验了,让我对于核和常用滤波的概念重新清楚了许多。
大家可以对比来看看:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43264167/article/details/124343702