滤波分类
首先我们应该了解一下什么是平滑。平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。平滑的一种作用就是用来减弱噪声。OpenCV中提供了两类常见的滤波器用来对图像进行平滑处理。
- 线性滤波:对邻域中的像素的计算为线性运算时,如利用窗口函数进行平滑加权求和的运算,或者某种卷积运算,都可以称为线性滤波。包括方框滤波(boxFilter)、均值滤波(blur)、高斯滤波(GaussianBlur)。
- 非线性滤波:非线性滤波利用原始图像跟模版之间的一种逻辑关系得到结果。包括中值滤波(medianBlur)和双边滤波(bilateralFilter)。
方框滤波
方框滤波是一种非常有用的线性滤波,也叫盒子滤波,均值滤波就是盒子滤波归一化的特殊情况。 应用: 可以说,一切需要求某个邻域内像素之和的场合,都有方框滤波的用武之地,比如:均值滤波、引导滤波、计算Haar特征等等。
函数原型:
void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )
代码实现:
using namespace cv;
using namespace std;
int main() {
//导入图片
Mat srcImage = imread("D:/image/111.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("D:/image/1112.jpg", blurImage);
waitKey(0);
return 0;
}
高斯滤波
高斯滤波是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用。在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声,如传统车牌识别等。
高斯滤波和均值滤波一样,都是利用一个掩膜和图像进行卷积求解。不同之处在于:均值滤波器的模板系数都是相同的为1,而高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小(服从二维高斯分布)。所以,高斯滤波器相比于均值滤波器对图像个模糊程度较小,更能够保持图像的整体细节。
函数原型:
void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
代码实现:
using namespace cv;
using namespace std;
int main() {
//导入图片
Mat srcImage = imread("D:/image/111.jpg");
if (!srcImage.data) {
printf("导入错误");
return 0;
}
//创建输出图像
Mat gussianblurImage;
//调用blur函数
GaussianBlur(srcImage, gussianblurImage, Size(3, 3),0,0);
namedWindow("gussianblur");
imshow("gussianblur", gussianblurImage);
imwrite("D:/image/1113.jpg", gussianblurImage);
waitKey(0);
return 0;
}