模糊原理:
1. 模糊原理和上几节说的图像掩模矩阵有很多相似的地方,都是拿一个矩阵(3X3, 5X5)等,和原图从左向右从上到下分别进行卷积,将卷积值最后赋值个当前卷积的中心像素。
2. 那么其最关键的参数,也就在于矩阵的大小和矩阵的值,我们通常称矩阵为卷积核。
3. 模糊操作的重要原因之一也是为了给图像预处理时降低噪声。
卷积示意图:

均值模糊:
均值模糊,也称为均值滤波,相当于卷积核的矩阵值全部为1/(卷积SIZE),如下图所示:
均值模糊API:
高斯模糊:
高斯模糊和均值模糊其原理上的唯一区别只是在于卷积核的值不同罢了,高斯卷积核矩阵值服从二维高斯函数
也就是说一个图像与服从二维高斯分布的函数做卷积,由于高斯函数是连续的,所有yaoj要将二维高斯函数进行采样和离散化,最后得到服从高斯函数规律的卷积核矩阵。
二维高斯函数具体公式如下:
图片处理后的效果如下:
高斯模糊常常用来模拟人眼中的物体,我们经常会看到好多相机拥有对背景模糊的功能,其背后的原理也是高斯模糊效果,让背景模糊,让前景更加突出,非常符合人眼的感官效果。
高斯卷积核矩阵采样后的数据,当矩阵长宽都为5,标准差sig为1.5的时候如下图:
我们可以观察都矩阵的四周数据值比较小,但是越靠内部值为大,整个矩阵的和为1,二维高斯函数计算后得到的特性,由于矩阵是离散的,以上图就是经过5X5=25个采样点后得到的高斯二维矩阵值的分布,然后在拿这个j矩阵与原图进行卷积就得到了高斯模糊效果。
代码演示:
在opencv中均值模糊和高斯模糊的代码非常简单,只需要调用提供的API接口就可以完成了,但是其原理我们还是要好好理解并消化的。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("E:/2.png");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
char input_title[] = "input image";
char output_title[] = "blur image";
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, src);
//均值模糊API
blur(src, dst, Size(11, 11), Point(-1, -1));
imshow(output_title, dst);
Mat gblur;
//高斯模糊API
GaussianBlur(src, gblur, Size(11, 11), 4, 4);
imshow("gaussian blur", gblur);
waitKey(0);
return 0;
}