Win32下的C++高斯模糊算法实例

/ 3评 / 0

Published by orzz.org(). (http://orzz.org/win32%e4%b8%8b%e7%9a%84c%e9%ab%98%e6%96%af%e6%a8%a1%e7%b3%8a%e7%ae%97%e6%b3%95%e5%ae%9e%e4%be%8b/)

下文内容较旧,最新的相关文章请参看:高斯模糊算法的实现和优化


高斯模糊算法的基本原理,是利用一个基于正态分布特征权重的矩阵,对图像中每个像素区域进行采样,并做卷积运算;之后将得到的结果赋值给采样区域的中心点像素.

这样每个像素都将被重新计算,并且计算结果考虑到了以待赋值像素为中心的采样区域里的所有像素.采样区域中每个像素分别与高斯矩阵中的对应权值相乘,并将得到的结果依次相加.最终的结果就是考虑到所有采样区域像素的一个像素值.

详细介绍及数学方程请参考:http://zh.wikipedia.org/zh/%E9%AB%98%E6%96%AF%E6%A8%A1%E7%B3%8A

下面给出Win32下的C++(下文的例子基于VS2008)算法实现.

首先,我们创建一个测试工程,例如:TestGauss.

之后在工作目录中放入一个24位的bmp(这里为了凸显算法本身,只处理较为容易解析的24位位图):

下面,我们需要加载这张bmp图片,以便得到内存中的像素数据:

然后在TestGauss.h中定义一个简单的bitmap结构,用于存放纯粹的像素指针及基本信息:

之后,写一个函数用于得到我们需要的bmp信息,并填充此结构:

声明处理函数:

定义外部调用的接口函数,实际上就是一个简单的包裹函数:

这里我们选取的取样区域半径为5(此半径不包括取样中心点).

下面我们开始实现Gauss函数,对得到的像素矩阵做高斯模糊运算.首先,我们需要定义并计算出一些必须的变量:

这里根据采样区域半径反算σ.由公式:d = 6σ + 1,可以得到σ = r / 3.

下面计算高斯矩阵:

参考公式: .实际上若使用此公式生成矩阵,算法应该是这样:

不过这样计算的矩阵,在nRadius == 1时会产生较大的偏差,因此这里我用nuclear保存并累加矩阵的所有乘积,在后面对像素处理之前用矩阵中的值除以nuclear,得到一个比较合适的权重值.

接下来,利用此矩阵对像素点进行区域采样并做卷积运算:

此时图像已经被我们成功的模糊处理完毕了.

下面给出处理效果对比:

其中左边为原图,右边为经过半径为5的高斯模糊处理之后的效果图.


完整示例下载:TestGauss.zip

对高斯模糊更详细的讲解请参考此文:高斯模糊算法的实现和优化

Published by orzz.org(). (http://orzz.org/win32%e4%b8%8b%e7%9a%84c%e9%ab%98%e6%96%af%e6%a8%a1%e7%b3%8a%e7%ae%97%e6%b3%95%e5%ae%9e%e4%be%8b/)

  1. st说道:

    生成的图像居然是全黑的图像 我晕

  2. […] 前两年我发过一文:Win32下的C++高斯模糊算法实例,里面给出了一个高斯模糊的实现,并写了粗略的简介。 […]

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据