Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OpenCV线性滤波(均值滤波,方框滤波,高斯滤波)

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

作者头像
zy010101
发布于 2020-03-19 08:51:25
发布于 2020-03-19 08:51:25
5K00
代码可运行
举报
文章被收录于专栏:程序员程序员
运行总次数:0
代码可运行

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

均值滤波

均值滤波从频域来看,它是一种低通滤波器,高频信号会被滤掉。均值滤波可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均值滤波是用每个像素和它周围像素计算出来的平均值替换图像中每个像素。

均值滤波器一般是使用下面的模板和图像做卷积来实现。

即以当前像素点为中心,求窗口内所有灰度值的和,以其平均值作为中心像素新的灰度值。

均值滤波有平均均值滤波和加权均值滤波。分别如下所示:

左边是平均均值滤波 右边是加权均值滤波

均值滤波可以模糊图像从而得到图像的大致描述。

方框滤波

方框滤波和均值滤波的原理是类似的,因为均值滤波是方框滤波的归一化表现。在OpenCV中,方框滤波使用的模板如下:

从方框滤波的模板可以看到,如果α = 1,那么就是方框滤波,不进行归一化;如果α != 1那么就进行归一化操作。

以5*5的卷积核为例,如果normalize == true,那么就是均值滤波,模板如下:

如果normalize != true,那么就是计算邻域像素和,不平均,卷积核如下:

高斯滤波

百度百科是这样介绍高斯滤波的,很清晰明了。

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声(高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声)。高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

一维高斯分布

通常我们在使用的时候都取标准正态分布。这时候

以3*3的模板为例,给出高斯滤波的卷积核

从卷积核可以看到,每一个像素点的权值不是全部相同的。更突出了中心点在像素平滑后的权重,相比于均值滤波而言,有着更好的平滑效果。

介绍完了方框滤波,均值滤波和高斯滤波的原理之后,我们来看看OpenCV提供的实现滤波的API

filter2D函数

首先介绍filter2D函数,这个函数需要给出卷积核即可实现各种滤波操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//filter2D函数原型
void filter2D( InputArray src, OutputArray dst, int ddepth,
                            InputArray kernel, Point anchor = Point(-1,-1),
                            double delta = 0, int borderType = BORDER_DEFAULT );

参数1:输入图像

参数2:输出图像

参数3:图像深度(指存储每个像素所用的位数),如果没写将生成与原图像深度相同的图像。当ddepth输入值为-1时,目标图像和原图像深度保持一致。

参数4:卷积核

参数5:卷积基准点(默认值为Point(-1,-1)表示取卷积中心即锚点)。

参数6:在储存目标图像前可选的添加到像素的值,默认值为0。一般不用

参数7: 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

boxFilter函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//boxFilter函数原型
void boxFilter( InputArray src, OutputArray dst, int ddepth,
                             Size ksize, Point anchor = Point(-1,-1),
                             bool normalize = true,
                             int borderType = BORDER_DEFAULT );

参数1:输入图像;

参数2:输出图像;

参数3:图像深度(指存储每个像素所用的位数),如果没写将生成与原图像深度相同的图像。当ddepth输入值为-1时,目标图像和原图像深度保持一致。

参数4:Size类型的ksize,卷积核的大小。一般这样写Size( w,h )来表示卷积核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小;

参数5:卷积基准点(默认值为Point(-1,-1)表示取卷积中心即锚点)。

参数6:默认值为true,根据上面讲述的原理,也就是默认归一化。

参数7: 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

blur函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//blur函数原型
void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        int borderType = BORDER_DEFAULT );

参数1:输入图像;

参数2:输出图像;

参数3:卷积核的大小;

参数4:卷积基准点(默认值为Point(-1,-1)表示取卷积中心即锚点)。

参数5: 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

GaussianBlur函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//GaussianBlur函数原型
void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );

参数1:输入图像;

参数2:输出图像;

参数3:卷积核的大小;

参数4:表示高斯核函数在X方向的的标准偏差;

参数5:表示高斯核函数在Y方向的的标准偏差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个都为零,则分别从ksize.width和ksize.height计算得出sigmaX和sigmaY;

参数6:像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

到此为止,需要用到的函数以及全部介绍完毕了。下面来看看实际的代码使用情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<opencv2/opencv.hpp>

using namespace cv;

int main()
{
	//使用boxFilter函数实现方框滤波
	Mat src1 = imread("C:/Users/zhou_/Desktop/1.jpg");
	Mat dst1(src1.size(), src1.type());
	if (!src1.data)
	{
		perror("load failed:");
		exit(-1);
	}
	imshow("src1", src1);

	boxFilter(src1, dst1, -1, Size(3, 3), Point(-1, -1));

	imshow("方框滤波", dst1);

	//同时,我们使用filter2D函数来实现模板是3*3的均值滤波
	Mat dst11;
	Mat kernel = (Mat_<double>(3, 3) << \
		1, 1, 1, \
		1, 1, 1, \
		1, 1, 1);

	kernel /= 9;		//归一化变换核,保持图像亮度不变

	filter2D(src1, dst11, -1, kernel);
	imshow("使用filter2D实现均值滤波", dst11);

	//均值滤波是方框滤波归一化后的特殊情形
	Mat blurresult;
	blur(src1, blurresult, Size(3, 3));

	imshow("使用blur实现均值滤波", blurresult);

	//高斯滤波
	Mat dst2;
	GaussianBlur(src1, dst2, Size(3, 3), 0, 0);

	imshow("使用GaussianBlur实现高斯滤波", dst2);

	Mat dst22;
	kernel = (Mat_<double>(3, 3) << \
		1, 2, 1, \
		2, 4, 2, \
		1, 2, 1);
	kernel /= 16;

	filter2D(src1, dst22, -1, kernel);
	imshow("使用filter2D实现高斯滤波", dst22);
	
	waitKey(0);
	return 0;
}

结果如下所示:

可以看到使用filter2D函数和Blur函数实现的效果是一样的。另外当方框滤波的卷积核大小和均值滤波一致并且归一化时,两者的效果也是一样的,所以上面三幅图像处理的效果时相同的。

使用filter2D和GaussianBlur的结果也是一样的。

另外,也可以看到均值滤波对于图像的模糊程度比高斯滤波要严重。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图像的卷积(滤波)运算(二)——高斯滤波
在图像处理中,选定X方向上长度为3的窗口,令δ=1,中心坐标为1,由上述公式,其卷积核(Xa,X,Xb)可以如下计算:
charlee44
2019/08/13
2K0
【CV学习2.1】 模糊
导览 OpenCV中的二值化方法 CV::blur BoxFilter MedienBlur GaussianBlur 01 CV::blur void blur( InputArray src,
EdenChen
2020/04/27
5690
OpenCV中常见的五个滤波函数
初学OpenCV的开发者很容易被OpenCV中各种滤波方法所困扰,不知道到底该用哪里一个来做滤波。表面原因看起来是因为OpenCV中各种滤波方式实在是太多太杂,其背后原因是对各种滤波方法的应用场景认知出现了问题,所以这里小编从应用场景与项目中解决问题的实际出发,跟大家一起探讨一下各种滤波方法。 一:模糊函数blur 参数说明 -参数InputArray表示输入图像Mat对象 -参数OutputArray表示模糊之后输出Mat对象 -参数Size表示卷积核大小,此参数决定模糊程度,Size(x, y)其中x,
OpenCV学堂
2018/04/04
2.3K0
OpenCV中常见的五个滤波函数
opencv 滤波 方框滤波 均值滤波 高斯滤波 中值滤波 双边滤波[通俗易懂]
方框滤波是所有滤波器中最简单的一种滤波方式。每一个输出像素的是内核邻域像素值的平均值得到。 通用的滤波kernel如下:
全栈程序员站长
2022/07/25
1.7K0
opencv 滤波 方框滤波 均值滤波 高斯滤波 中值滤波 双边滤波[通俗易懂]
【从零学习OpenCV 4】可分离滤波
前面介绍的滤波函数使用的滤波器都是固定形式的滤波器,有时我们需要根据实际需求调整滤波模板,例如在滤波计算过程中滤波器中心位置的像素值不参与计算,滤波器中参与计算的像素值不是一个矩形区域等。OpenCV 4无法根据每种需求单独编写滤波函数,因此OpenCV 4提供了根据自定义滤波器实现图像滤波的函数,就是我们本章最开始介绍的卷积函数filter2D(),不过根据函数的名称,这里称呼为滤波函数更为准确一些,输入的卷积模板也应该称为滤波器或者滤波模板。该函数的使用方式我们在一开始已经介绍,只需要根据需求定义一个卷积模板或者滤波器,便可以实现自定义滤波。
小白学视觉
2019/12/30
1.2K0
【OpenCV入门之十六】多种方式模糊图像
其中:f()表示一副图像,i、j表示图像的行和列,h(k,l)表示卷积算子(和)(也可以叫掩膜),k l又可以叫窗口大小(掩膜的大小,比如3*3),g()表示输出的像素值;
小白学视觉
2019/06/02
6110
【从零学习OpenCV 4】均值滤波
经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。
小白学视觉
2019/12/25
7320
【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
效果图看完,我们来唠唠嗑。 首先,需要说明的是,浅墨这篇文章最后的示例代码是采用两周前刚刚发布的2.4.9来书写的。里面的lib都已经改成了2.4.9版本的。如果大家需要运行的话,要么配置好2.4.9.要么把浅墨在工程中包含的末尾数字为249的各种lib改成之前的248或者你对应的OpenCV版本。 不然会提示: LINK : fatal error LNK1181: 无法打开输入文件“opencv_calib3d248.lib”之类的错误。 OpenCV 2.4.9的配置和之前的2.4.8差不多,如果还是不太清楚,具体可以参考浅墨修改过的对应2.4.9版的配置文章: 【OpenCV入门教程之一】 安装OpenCV:OpenCV 2.4.8或2.4.9 +VS 开发环境配置 第二,给大家分享一个OpenCV中写代码时节约时间的小常识。其实OpenCV中,不用namedWindow,直接imshow就可以显示出窗口。大家看下文的示例代码就可以发现,浅墨在写代码的时候并没有用namedWindow,遇到想显示出来的Mat变量直接imshow。我们一般是为了规范,才先用namedWindow创建窗口,再imshow出它来,因为我们还有需要用到指定窗口名称的地方,比如用到trackbar的时候。而一般情况想显示一个Mat变量的图片的话,直接imshow就可以啦。 OK,开始正文吧~ 一、关于边缘检测 在具体介绍之前,先来一起看看边缘检测的一般步骤吧。 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。常见的滤波方法主要有高斯滤波,即采用离散化的高斯函数产生一组归一化的高斯核(具体见“高斯滤波原理及其编程离散化实现方法”一文),然后基于高斯核函数对图像灰度矩阵的每一点进行加权求和(具体程序实现见下文)。 2)增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定。 3)检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是我们要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。 另外,需要注意,下文中讲到的Laplace算子,sobel算子和Scharr算子都是带方向的,所以,示例中我们分别写了X方向,Y方向和最终合成的的效果图。 OK,正餐开始,召唤canny算子。:) 二、canny算子篇 2.1 canny算子相关理论与概念讲解
全栈程序员站长
2022/09/02
1K0
【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
【从零学习OpenCV 4】方框滤波
方框滤波是均值滤波的一般形式,在均值滤波中,将滤波器中所有的像素值求和后的平均值作为滤波后结果,方框滤波也是求滤波器内所有像素值的之和,但是方框滤波可以选择不进行归一化,就是将所有像素值的和作为滤波结果,而不是所有像素值的平均值。
小白学视觉
2019/12/25
8840
【从零学习OpenCV 4】方框滤波
OpenCV 边缘检测
Canny 边缘检测算子,其算法步骤大体如下: 1) 用高斯滤波器对输入图像做平滑处理 (大小为 5x5 的高斯核)
AI异构
2020/07/29
1K0
OpenCV 边缘检测
【从零学习OpenCV 4】高斯滤波
高斯噪声是一种常见的噪声,图像采集的众多过程中都容易引入高斯噪声,因此针对高斯噪声的高斯滤波也广泛应用于图像去噪领域。高斯滤波器考虑了像素离滤波器中心距离的影响,以滤波器中心位置为高斯分布的均值,根据高斯分布公式和每个像素离中心位置的距离计算出滤波器内每个位置的数值,从而形成一个形如图5-15所示的高斯滤波器。之后将高斯滤波器与图像之间进行滤波操作,进而实现对图像的高斯滤波。
小白学视觉
2019/12/30
1.4K0
OpenCV图像处理笔记(二):图片操作进阶
一、图像模糊 1、模糊原理 Smooth/Blur 是图像处理中最简单和常用的操作之一 使用该操作的原因之一就为了给图像预处理时候减低噪声 使用Smooth/Blur操作其背后是数学的卷积计算 通常这
MiChong
2020/09/24
1.2K0
OpenCV图像处理笔记(二):图片操作进阶
详解OpenCV卷积滤波之边缘处理与锚定输出
OpenCV在使用卷积进行图像处理过程种,如何处理边缘像素与锚定输出两个技术细节一直是很多人求而不得的疑惑。其实OpenCV在做卷积滤波时会对图像进行边界填充,实现对边缘像素的卷积计算的支持,不同填充方式与不同锚定点会得到图像卷积输出不同的结果。
OpenCV学堂
2019/05/13
1.4K0
详解OpenCV卷积滤波之边缘处理与锚定输出
手撕OpenCV源码之高斯模糊
从上述代码的大致分析中可以知道,OpenCV的GaussianBlur本质上依然是filter2D,只是针对一些特殊情况进行了GPU和CPU版本的优化,如果输入的维度等信息不满足这些特殊情况,则选择使用filter2D进行计算.关于优化不是本文的重点,filter2D会在后续的博文中进行详细分析,所以这里只对获取GaussianKernel的部分进行介绍.
OpenCV学堂
2018/07/26
2.5K0
理解图像卷积操作的意义
卷积一词最开始出现在信号与线性系统中,信号与线性系统中讨论的就是信号经过一个线性系统以后发生的变化。由于现实情况中常常是一个信号前一时刻的输出影响着这一时刻的输出,所在一般利用系统的单位响应与系统的输入求卷积,以求得系统的输出信号(当然要求这个系统是线性时不变的)。 卷积的定义: 卷积是两个变量在某范围内相乘后求和的结果。如果卷积的变量是序列x(n)和h(n),则卷积的结果:
全栈程序员站长
2022/09/01
1.1K0
CV学习笔记(六):均值滤波与高斯滤波
过滤是信号和图像处理中基本的任务。其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息。过滤可以移除图像中的噪音、提取感兴趣的可视特征、允许图像重采样等等。频域分析将图像分成从低频到高频的不同部分。低频对应图像强度变化小的区域,而高频是图像强度变化非常大的区域。在频率分析领域的框架中,滤波器是一个用来增强图像中某个波段或频率并阻塞(或降低)其他频率波段的操作。低通滤波器是消除图像中高频部分,但保留低频部分。高通滤波器消除低频部分.
云时之间
2020/02/12
1.2K0
理解图像卷积操作的意义
chaibubble
2018/01/02
4.1K0
理解图像卷积操作的意义
图像处理算法 之 滤波 模糊(基于OpenCV)
高斯噪声是指幅值的概率密度函数服从高斯分布的噪声,如果其功率谱密度服从均匀分布,则为高斯白噪声。
233333
2020/11/11
9680
图像处理算法 之 滤波 模糊(基于OpenCV)
OpenCV Python 系列教程 4 - OpenCV 图像处理(上)
HSV 的色相范围为 [0,179],饱和度范围为 [0,255],值范围为 [0,255]。不同的软件使用不同的规模。
机器视觉CV
2019/07/15
3.1K0
OpenCV Python 系列教程 4 - OpenCV 图像处理(上)
方框滤波
算法:方框滤波可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值还是邻域像素值之和。
裴来凡
2022/05/28
3630
方框滤波
相关推荐
图像的卷积(滤波)运算(二)——高斯滤波
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验