在上一讲中谈到了图像滤波的原理和一些常见的方法,在本讲中将从代码实现的角度讨论三种常见的线性滤波器。
1. 方框滤波
-
方框滤波(box Filter) —>
boxblur
boxblur函数的作用是使用方框滤波器来模糊一张图片.
2. 均值滤波
-
均值滤波,归一化后的方框滤波 —>
blur
最简单的一种滤波操作,输出图像的每一个像素是"核"窗口内输入图像对应区域像素的平均值,即所有像素加权系数相等。 "缺陷", 不能很好地保护细节,去噪的同时也破坏了图像的部分细节,使得图像变得模糊。
3. 高斯滤波
高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器, 高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。
4. 源代码剖析
FilterEngine
(内部) ---- 图像滤波功能的核心引擎。它包含了所有必要的中间缓存器。
在实际中使用这些滤波器函数非常简单,如下所示:
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
/*****************************
* void boxFilter( InputArray src, OutputArray dst, int ddepth,
* Size ksize, Point anchor = Point(-1,-1),
* bool normalize = true,
* int borderType = BORDER_DEFAULT );
*
* ddepth : 输出图像的深度,-1代表原图深度;
* ksize : 内核的大小
* anchor : 表示锚点, 就是被平滑的那个点
* normalize : 是否归一化
*
***********************************************/
int main(int argc, char** argv)
{
if(! argc ==2)
{
std::cerr<<"please run ./Binary ../cfg/timg2.jpeg \n";
}
string filename = argv[1];
Mat srcImage = imread(filename,1);
Mat blurOut, boxOut, GaussianOut;
imshow("srcImage",srcImage );
blur(srcImage, blurOut, Size(5, 5));
imshow("blur", blurOut);
boxFilter(srcImage, boxOut, -1, Size(5, 5));
imshow("boxFilter", boxOut);
// sigmaX --> 代表x方向上的标准偏差;
GaussianBlur(srcImage, GaussianOut, Size(5, 5), 0, 0 );
imshow("GaussianBlur", GaussianOut);
waitKey(0);
return 0;
}
5. 运行结果如下图
在上图中从左到右依次为:均值滤波、方框滤波、高斯滤波以及原图