一、基本概念了解
1.什么是图像滤波?
官方解释:图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
个人理解:为图像滤波是通过设计合适的滤波器和阈值对平时工作和环境引起的噪声的减弱与抑制。
2.线性滤波
首先我们应该了解一下什么是平滑。平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。平滑的一种作用就是用来减弱噪声。OpenCV中提供了两类常见的滤波器用来对图像进行平滑处理。一类是线性滤波,包括 方框滤波(boxFilter)、均值滤波(blur)、高斯滤波(GaussianBlur);另一类是非线性滤波器,包括中值滤波(medianBlur)和双边滤波(bilateralFilter)。而本篇博客主要是对线性滤波进行学习总结。
3.卷积
卷积是两个变量在某范围内相乘后求和的结果(g(x,y)蓝色部分)。卷积是一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图像滤波。对于图像操作来说就是在每一个图像块(f(x,y)红色区域)与某个核(h(x,y))之间进行的运算。
4.算子(核)
核就是图像处理时,给定输入图像,在输出图像中每一个像素是输入图像中一个小区域中像素的加权平均,其中权值由一个函数定义,这个函数称为卷积核。核说白了就是一个固定大小的数值数组。该数组带有一个 锚点 ,一般位于数组中央。
二、线性滤波器介绍
归一化块滤波器
官方解释是这样的:最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等),其中,归一化就是把要处理的量都缩放到一个范围内,比如(0,1),以便统一处理和直观量化。包括方框滤波与均值滤波。
核如下:
函数原型如下:
void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
- src:输入图片。
- dst:输出图像,应与原图像大小、类型一样。
- ddepth:图像深度(图像深度是指存储每个像素所用的位数,也用于度量图像 的色彩分辨率。详细解释请自行搜索),-1表示与原图深度相同。
- ksize:可以看成Size(w,h),即内核大小( w 像素宽度, h 像素高度)。
- anchor:指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。
- borderType:一般默认为BORDER_DEFAULT ,目前不去了解。
1.方框滤波------boxFilter
函数原型如下:
void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )
-
src:输入图片。
-
dst:输出图像。
-
ddepth:图像深度
-
ksize:可以看成Size(w,h),即内核大小( w 像素宽度, h 像素高度)。
-
anchor:指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。
-
boolnormalize:bool类型的normalize,默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了。
-
borderType:一般默认为BORDER_DEFAULT 。
运用如下:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main() {
//导入图片
Mat srcImage = imread("E:/image/test.jpg");
if (!srcImage.data) {
printf("导入srcImage错误");
return 0;
}
//创建输出图像
Mat boxFilterImage;
//调用boxFilter函数
boxFilter(srcImage, boxFilterImage, -1, Size(3, 3), Point(-1, -1), false);
namedWindow("boxFilter");
imshow("boxFilter", boxFilterImage);
waitKey(0);
return 0;
}
原图如下
经过方框滤波后的图片
2.均值滤波
在方框滤波中,当normalize=true的时候,方框滤波就变成了均值滤波。均值滤波是方框滤波归一化(normalized)后的特殊情况
函数原型如下:
void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
- src:输入图片。
- dst:输出图像。
- ddepth:图像深度。
- ksize:可以看成Size(w,h),即内核大小( w 像素宽度, h 像素高度)。
- anchor:指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。
- borderType:一般默认为BORDER_DEFAULT 。
运用如下:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main() {
//导入图片
Mat srcImage = imread("E:/image/test.jpg");
if (!srcImage.data) {
printf("导入srcImage错误");
return 0;
}
//创建输出图像
Mat blurImage;
//调用blur函数
blur(srcImage, blurImage, Size(3, 3), Point(-1, -1));
namedWindow("blur");
imshow("blur", blurImage);
imwrite("E:/image/test_2.jpg", blurImage);
waitKey(0);
return 0;
}
3.高斯滤波
高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值。它是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程
函数如下
void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
- src: 输入图像
- dst: 输出图像
- kisize:可理解为Size(w, h) 定义内核的大小(需要考虑的邻域范围)。 w 和 h 必须是正奇数,否则将使用\sigma_x 和 sigma_y 参数来计算内核大小。
- sigma_x: x 方向标准方差, 如果是 0 则 sigma_x 使用内核大小计算得到。
- sigma_y: y 方向标准方差, 如果是 0 则 sigma_y 使用内核大小计算得到。.
- borderType:一般默认为BORDER_DEFAULT 。
运用如下:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main() {
//导入图片
Mat srcImage = imread("E:/image/test.jpg");
if (!srcImage.data) {
printf("导入srcImage错误");
return 0;
}
//创建输出图像
Mat gussianblurImage;
//调用blur函数
GaussianBlur(srcImage, gussianblurImage, Size(3, 3),0,0);
namedWindow("gussianblur");
imshow("gussianblur", gussianblurImage);
imwrite("E:/image/test_3.jpg", gussianblurImage);
waitKey(0);
return 0;
}
参考:
https://blog.csdn.net/poem_qianmo/article/details/22745559
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html#id5