【CS】高斯模糊GaussianBlur原理与实践

来源:互联网 发布:局内Windows无法访问 编辑:程序博客网 时间:2024/06/05 02:46
高斯模糊算法GaussianBlur原理与实践

e-mail:chentravelling@163.com

在学习SIFT算法时接触到了高斯模糊,之前有所耳闻,一直没有认真了解“模糊”和“平滑”的原理。本篇文章简单介绍高斯模糊的原理,以及通过opencv中高斯模糊算法进行实际编程。
高斯模糊
模糊的原理可以理解为将每一个像素点设置成它周边领域内像素的均值,均值可以是平均值、中值等等,比如以下示意图。
左图中心像素点值为2,周围3×3领域内的像素点都为1,取平均值为1,将其设置为中心像素点的值,成为右图的形式。
这种简单平均进行模糊显然是不合理的,因为实际上一幅图像基本都是连续的,这也意味着越相邻的像素点之间的关系越密切,权重应该越高,越疏远的像素点之间的关系也越疏远,权重应该越低。因此我们应该使用加权平均的方法进行模糊。
正态分布是一种钟形曲线,那么越接近中心,取值越大,反之越小。


由于图像是二维的,高斯模糊则将二维正态分布作为权重分配的模式。


将中心点作为原点,所以二维正态分布的密度函数,即二维高斯函数公式如下:



那么由此即可计算每一个像素点的权重了。假设σ=1.5,模糊半径为1,那么此时权重矩阵如下:
 
这9个点的权重相加后不为1,做归一化处理,即每个权重/9个权重的和作为该像素的新权重,可以得到下图所示的权重矩阵:

然后进行模糊计算:假设中心像素值为25,其周围模糊半径为1的的像素值如下图所示:
那么每个像素点乘以对应的权重值,得到下图所示的矩阵:

再将这个9个数据相加,作为中心像素点的值。如果原图是RGB图像,则将三个通道的值分别进行模糊计算即可。
对于边界上的像素点,进行模糊时,只需将已有的一侧的点拷贝到另一侧,构成完成的矩阵即可。

C++代码
代码还是非常简单,直接调用即可。而关于该算法的原理还是非常值得借鉴。
<span style="font-family:Microsoft YaHei;font-size:14px;">#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;int main(){Mat image = imread("building.jpg");Mat out ;GaussianBlur(image,out,Size(3,3),4);imshow("GaussianBlur",out);//imwrite("blur.jpg",out);waitKey();return 0;}</span>

运行结果
原图:


高斯模糊处理后:



0 0