均值滤波用到的是图像卷积原理。由下图所示,卷积核为三阶单位矩阵时,进行均值滤波,原图像的每个三阶子矩阵都会求其均值,并将均值赋给中间的元素。
以左上角为例:
( A 11 A_{11} A11·1+ A 12 A_{12} A12·1+ A 13 A_{13} A13·1+
A 21 A_{21} A21·1+ A 22 A_{22} A22·1+ A 23 A_{23} A23·1+
A 31 A_{31} A31·1+ A 32 A_{32} A32·1+ A 33 A_{33} A33·1 )/ 9 -> A 22 A_{22} A22
在OpenCV/C++中,提供了blur函数用于实现上述的均值滤波操作:
void blur(
InputArray src, //输入图像
OutputArray dst, //输出图像
Size ksize, //卷积核Size类型
Point anchor=Point(-1,-1), //Point类型的锚点(-1表示锚点在核中心)
int borderType=BORDER_DEFAULT //边界模式
)
其中 Size(w, h)
来表示内核的大小,w 为像素宽度,h为像素高度。
根据上面的 blur()
函数的定义,可以写出均值滤波的测试代码。
void MyDemo::blur_Demo(Mat& image) {
Mat dst;
blur(image, dst, Size(10, 10), Point(-1, -1));
imshow("Blur", dst);
}
下图是卷积核为 Size(10,10)
的效果。
下图为卷积核为 Size(1,15)
的效果。
有时候我们并不希望模糊处理时卷积核的系数都一样。而高斯模糊就是用于解决这类问题的一个方法。高斯模糊产生的系数在中心最大,离中心越远系数越小。
void cv::GaussianBlur(
InputArray src, //输入图片,可以使是任意通道数,该函数对通道是独立处理的
OutputArray dst, //输出图片
Size ksize, //高斯内核大小
double sigmaX, //高斯内核在X方向的标准偏差
double sigmaY, //高斯内核在Y方向的标准偏差
int borderType //判断图像边界的模式
)
其中ksize
的行数和列数允许不相同,但必须是正奇数。
如果sigmaY为0,他将和sigmaX的值相同,如果他们都为0,那么他们由ksize的行数列数计算得出。
示例程序:
void MyDemo::gaussianBlur_Demo(Mat& image) {
Mat dst;
GaussianBlur(image, dst, Size(5, 5), 15);
imshow("GaussianBlur", dst);
}