【拜小白opencv】30-平滑处理3线性滤波之——高斯滤波

常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。

本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。

博主机器配置为:VS2013+opencv2.4.13+Win-64bit。

若本文能给读者带来一点点启示与帮助,我就很开心了。

=========================分割线========================


1-高斯滤波

  • 高斯滤波(高斯平滑)是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。
  • 通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
  • 高斯滤波是最有用的滤波器 (尽管不是最快的)。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效


那么问题来了,什么是高斯滤波?

首先,它引入了数学中的高斯函数(正态分布函数)(PS:对于平面图像来说,往往用到的是二维函数)。


高斯滤波的思路就是:对高斯函数进行离散化,以离散点上的高斯函数值为权值,对我们采集到的灰度矩阵的每个像素点做一定范围邻域内的加权平均,即可有效消除高斯噪声

离散的高斯卷积核H:(2k+1)×(2k+1)维,其元素计算方法为:

【拜小白opencv】30-平滑处理3线性滤波之——高斯滤波_第1张图片

其中Sigma为方差,k确定核矩阵的维数。

通过上述公式,我们可以方便地求出高斯模板,从而进行高斯滤波处理。这里不得不提在图像处理中,高斯滤波一般有两种实现方式一是用离散化窗口滑窗卷积,另一种通过傅里叶变换。最常见的就是第一种滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常大(即使用可分离滤波器的实现)的情况下,可能会考虑基于傅里叶变化的实现方法。

本文只介绍前者,实际上前者运用也是最多的。那什么叫离散化窗口滑窗处理呢?我们把这个方法分成四个关键词:“离散化”“窗口”“滑窗”“卷积”,接下来一一解释这些名词:

  • “离散化”:上面已经提到了离散的高斯卷积核,实际上就是将高斯函数进行离散化,方便程序计算高斯模板;
  • “窗口”:这个窗口比喻得很形象,实际上我的理解就是M*N维的高斯模板;
  • “滑窗”:有了这个高斯模板,接下来是结合我们待处理的灰度数据,处理一个接着一个的像素点。例如说,处理完(1,1)这个点之后,接下来要处理(1,2)这个数据点,那么模板相当于右移了一个像素点,那么我们可以把这个过程形象地看作是滑窗。在碰上待处理图像的边缘时,往往处理不了,此时要进行特殊处理,比如说在检测到边缘时,复制原来的灰度数据,即不处理;
  • “卷积”:在高数里有过这个概念,然而在这个地方,卷积远远没有书上的那么复杂,实际上就是待处理图像的各像素灰度数据与模板对应元素的数值的加权和的运算过程,就称之为卷积。


 有了以上解释之后,我们可以把“离散化”和“窗口”看成是第一个步骤,可以称之为预处理,通过对高斯函数离散化得到的函数来编程得到你所需要的高斯模板,也就是窗口;把“滑窗”和“卷积”看作是第二个步骤,可以称之为处理过程,通过“滑窗”的方式来进行“卷积”过程。


实际上,在OpenCV中处理起来没这么复杂,因为已经将高斯滤波封装在GaussianBlur()函数中。


=========================分割线==================

2-GaussianBlur()函数——高斯滤波

OpenCV将高斯滤波封装在GaussianBlur()函数中,作用是输入一副图像对其进行高斯滤波。下面来看下GaussianBlur()函数的定义:

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

参数说明

  • 参数1:输入要处理的图像。
  • 参数2:得到处理后的输出图像,与输入图像有一样的尺寸和类型。
  • 参数3:高斯内核的大小。一般用Size(w,h)来表示内核大小,其中w为像素宽度,h为像素高度,w与h可以不同,但必须是正数和奇数,或者为0.
  • 参数4:表示高斯核函数在X方向的标准偏差。
  • 参数5:表示高斯核函数在Y方向的标准偏差。
  • 参数6:用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT,我们一般不用管它。
======================分割线==================

3-代码演示

/*
	线性滤波——高斯滤波
*/

#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;
}

=========================分割线======================

4-显示结果

【拜小白opencv】30-平滑处理3线性滤波之——高斯滤波_第2张图片


=======================分割线====================


5-程序说明

参考文献:openCV学习笔记----高斯滤波基本概念及简单应用(一)


=====================END================

你可能感兴趣的:(【拜小白OpenCV】,一步步学习OpenCV2)