常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。
本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。
博主机器配置为:VS2013+opencv2.4.13+Win-64bit。
若本文能给读者带来一点点启示与帮助,我就很开心了。
=========================分割线========================
那么问题来了,什么是高斯滤波?
首先,它引入了数学中的高斯函数(正态分布函数)(PS:对于平面图像来说,往往用到的是二维函数)。
高斯滤波的思路就是:对高斯函数进行离散化,以离散点上的高斯函数值为权值,对我们采集到的灰度矩阵的每个像素点做一定范围邻域内的加权平均,即可有效消除高斯噪声。
离散的高斯卷积核H:(2k+1)×(2k+1)维,其元素计算方法为:
其中Sigma为方差,k确定核矩阵的维数。
通过上述公式,我们可以方便地求出高斯模板,从而进行高斯滤波处理。这里不得不提在图像处理中,高斯滤波一般有两种实现方式,一是用离散化窗口滑窗卷积,另一种通过傅里叶变换。最常见的就是第一种滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常大(即使用可分离滤波器的实现)的情况下,可能会考虑基于傅里叶变化的实现方法。
本文只介绍前者,实际上前者运用也是最多的。那什么叫离散化窗口滑窗处理呢?我们把这个方法分成四个关键词:“离散化”“窗口”“滑窗”“卷积”,接下来一一解释这些名词:
有了以上解释之后,我们可以把“离散化”和“窗口”看成是第一个步骤,可以称之为预处理,通过对高斯函数离散化得到的函数来编程得到你所需要的高斯模板,也就是窗口;把“滑窗”和“卷积”看作是第二个步骤,可以称之为处理过程,通过“滑窗”的方式来进行“卷积”过程。
实际上,在OpenCV中处理起来没这么复杂,因为已经将高斯滤波封装在GaussianBlur()函数中。
=========================分割线==================
OpenCV将高斯滤波封装在GaussianBlur()函数中,作用是输入一副图像对其进行高斯滤波。下面来看下GaussianBlur()函数的定义:
void GaussianBlur(InputArray src,OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT);
/*
线性滤波——高斯滤波
*/
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
//------------【1】读取源图像并检查图像是否读取成功------------
Mat srcImage = imread("D:\\OutPutResult\\ImageTest\\boat1.jpg");
if (!srcImage.data)
{
cout << "读取图片错误,请重新输入正确路径!\n";
system("pause");
return -1;
}
imshow("【源图像】", srcImage);
//------------【2】对图像进行高斯滤波处理------------
Mat dstImage;
GaussianBlur(srcImage, dstImage, Size(7, 7), 0, 0);
imshow("【高斯滤波】", dstImage);
waitKey(0);
return 0;
}
=======================分割线====================
参考文献:openCV学习笔记----高斯滤波基本概念及简单应用(一)
=====================END================