均值滤波将滤波器内所有的像素值都看作中心像素值的测量,将滤波器内所有的像数值的平均值作为滤波器中心处图像像素值。滤波器内的每个数据表示对应的像素在决定中心像素值的过程中所占的权重,由于滤波器内所有的像素值在决定中心像素值的过程中占有相同的权重,因此滤波器内每个数据都相等。均值滤波的优点是在像素值变换趋势一致的情况下,可以将受噪声影响而突然变化的像素值修正到接近周围像素值变化的一致性下。但是这种滤波方式会缩小像素值之间的差距,使得细节信息变得更加模糊,滤波器范围越大,变模糊的效果越明显。
void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT );
- 待均值滤波的图像,图像的数据类型必须是CV_8U、CV_16U、CV_16S、CV_32F和CV_64F这五种数据类型之一。
- dst:均值滤波后的图像,与输入图像具有相同的尺寸和数据类型。
- ksize:卷积核尺寸。
- anchor:内核的基准点(锚点),其默认值为(-1,-1)代表内核基准点位于kernel的中心位置。基准点即卷积核中与进行处理的像素点重合的点,其位置必须在卷积核的内部。
- borderType:像素外推法选择标志,取值范围在表3-5中给出,默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
该函数的第一个参数为待滤波图像,可以是彩色图像也可以是灰度图像,甚至可以是保存成Mat类型的多维矩阵数据。第二个参数滤波后的图像,保持与输入图像相同的数据类型、尺寸以及通道数。第三个参数是滤波器的尺寸,输入滤波器的尺寸后函数会自动确定滤波器,其形式如式
所示。
函数的第四个参数为确定滤波器的基准点,默认状态下滤波器的几何中心就是基准点,不过也可以根据需求自由的调整,在均值滤波中调整基准点的位置主要影响图像外推的方向和外推的尺寸。第五个参数是图像外推方法选择标志,根据需求可以自由的选择。原图像边缘位置滤波计算过程需要使用到外推的像素值,但是这些像素值并不能真实反应图像像素值的变化情况,因此在滤波后的图像里边缘处的信息可能会出现巨大的改变,这属于正常现象。如果在边缘处有比较重要的信息,可以适当缩小滤波器尺寸、选择合适的滤波器基准点或者使用合适的图像外推算法。
简单示例
//
// Created by smallflyfly on 2021/6/11.
//
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main() {
Mat im = imread("test.jpg");
resize(im, im, Size(0, 0), 0.5, 0.5);
Mat gaussNoise = Mat::zeros(im.rows, im.cols, im.type());
RNG rng;
rng.fill(gaussNoise, RNG::NORMAL, 10, 20);
Mat imGaussNoise = im + gaussNoise;
imshow("gauss im", imGaussNoise);
Mat blurIm1, blurIm2;
blur(imGaussNoise, blurIm1, Size(3, 3));
imshow("blur im1", blurIm1);
blur(im, blurIm2, Size(3, 3));
imshow("blurIm2", blurIm2);
waitKey(0);
destroyAllWindows();
return 0;
}