高斯模糊原理及实现

高斯模糊即对指定像素和其周围像素进行加权平均来得到最终结果,使用高斯分布作为滤波器。

 

高斯分布即为正太分布,1维和2维正态分布密度函数如下

 


 

这里设μ=0, ρ=0.

u为期望,σ为标准差,μ±σ为函数图像的拐点,σ越大曲线越矮越宽,即采样范围越大。

 

在这两个函数中,x,y表示相对于中心像素(0,0)的偏移量(以像素为单位)

 

这两个函数的结果表示在x或(x,y)处的像素的权重,或者说在模糊后周围像素分别将产生多少的贡献来影响目标像素.

 

一维高斯函数当标准差为1时的一些值:

 

G(0) = 0.3989422804
G(1) = G(-1) = 0.2419707245
G(2) = G(-2) = 0.0539909665
G(3) = G(-3) = 0.0044318484

 

它们用于计算高斯模糊的含义如下:

 

●在x=0处,即目标像素处,像素颜色的0.39应被保持.

●在x=1和x=-1处,像素颜色的0.24应被保持.

 

采样像素越多,结果就越精确,根据高斯分布的3σ原则,99.73%的值会落在 (μ-3σ, μ+3σ)中,所以采样像素应根据σ的取值来决定,不宜过多.

 

为每个采样像素应用高斯函数计算出它的权重之后,乘上此像素的颜色值,得到此像素为目标像素颜色的贡献值,最后将所有采样点的贡献值加起来就可以得到被模糊后目标像素的颜色.

 

 

使用以上方法进行模糊计算后会出现一个问题,即被模糊后的图像会变暗,当σ较大时尤甚.

 

比如:设待模糊的纹理是一张单通道的纯白色纹理,这样每个像素值都为1.

对某一像素p,在第一遍高斯模糊即横向的模糊后

 

p_h_color = G(0)+G(-1)+G(1)+G(-2)+G(2) = 0.990805625.

 

要保持原先的亮度,模糊后的结果也应该为1才对,当第二遍模糊处理之后,结果就更糟了

 

p_hv_color=0.9818147611.

 

所以值需要被修正,使此处模糊后的结果为1

AugFactor = 1 / p_h_color = 1.009218543

 

将这个修正值乘到最后结果p_h_color上和p_hv_color上,即得到正确结果.

 

 

关于1维和2维的高斯函数

 

这里有两种选择:

1.使用1D的版本两次,一次水平,一次垂直(在上一次的基础上), 基于高斯是卷积运算,将2D采样区域分为两个一维向量是可行的.

2.使用2D的版本一次

 

而使用1D版本做两次模糊效率要高于使用2D版本

 

假设n为采样区域的大小,即nxn, p为待模糊纹理中的像素数目。

那么:

在1D版本中,一共要采样2np次,即对每一个像素需采样横竖各n次。

在2D版本中,一共要采样n2p次,即对每一像素要采样n2次。

 

高斯模糊的实现

 

 

代码取自NVIDIA的soft shadows示例中

 

 

没有更多推荐了,返回首页