高斯模糊原理

基本概念

二维高斯模糊,或者说高斯滤波,是图像处理中非常常见的操作。操作的核心是使用一个从高斯分布中采样得到的掩膜,或者叫核,和输入图片中的每个像素及其邻域进行计算,结果保存到输出图片中。假设高斯核窗口尺寸为 (2w+1)×(2w+1) ,高斯分布的标准差为  σ ,则高斯核可以表示为矩阵的形式 

由于高斯分布的概率密度函数的非零值区间主要集中在  (3σ,3σ)  内,所以为了保证选取的高斯核的完整性,一般取  w3σ

说完了高斯核,该说高斯模糊的表达式了。设输入图片为  X ,输出图片为  Y ,第  i  行第  j  列的数据表示为  X(i,j)  和  Y(i,j) ,则使用窗口大小为  (2w+1)×(2w+1) ,标准差为  σ  的高斯核计算后的结果为 


可分离核形式实现

但是,注意到,高斯核的表达式是可分离的。下面为了表示方便,令 



Y=6101725334148517101725334148518111826344249529121927354350531013202836445154111421293745525512152230384653561215223038465357

符合局部性原则的内存访问加速

下面来考虑上述方法在内存访问效率方面的问题。利用  G2  和  X  计算  Z  的过程中,内存访问都是连续的,都是从左到右的形式。但是在利用  G1  和  Z  计算  Y  的过程中,取出每一列中的相邻数据,需要跨行。如果需要处理的图片宽度比较大,跨行访问数据可能会导致 Cache Miss,这是违反了内存访问局部性原则的。为了解决这一问题,利用  G1  和  Z  计算  Y  的方法需要调整。

实际上,利用  G1  和  Z  计算  Y  同样可以按行的方式计算。为了表述方便,以计算  Y  的第 2 行(下标从 0 开始) Y(2,) 为例, 

Y(2,)=G1(0)Z(0,)+G1(1)Z(1,)+G1(2)Z(2,)+G1(3)Z(3,)+G1(4)Z(4,)
其中  G1(i)  表示  G1  的第  i  个元素, Z(i,)  表示  Z  的第  i  行。

在代码实现的时候,为了计算  Y(2,) ,初始化一个长度为 8 的浮点数行向量  T ,令里面的值全等于零,然后用遍历行元素的方式进行如下计算 

TTTTT=T+G1(0)Z(0,)=T+G1(1)Z(1,)=T+G1(2)Z(2,)=T+G1(3)Z(3,)=T+G1(4)Z(4,)

最后将  T  中的浮点数的值四舍五入赋值给  Y(2,) 。这样就避免了内存访问跨行的问题。注意,为了满足内存访问的局部性,增加了内存使用量,多用了  T

对于边界行,按照镜像对称的方式选取相应行进行计算。比如,为了计算  Y(0,) ,初始化一个长度为 8 的浮点数行向量  T ,令里面的值全等于零,然后用遍历行元素的方式进行如下计算 

TTTTT=T+G1(0)Z(2,)=T+G1(1)Z(1,)=T+G1(2)Z(0,)=T+G1(3)Z(1,)=T+G1(4)Z(2,)

最后将  T  中的浮点数的值四舍五入赋值给  Y(0,)

扩展与总结

本文中所讲述的高斯模糊的计算方法,可以扩展到任意尺寸可分离核的滤波的实现。

设输入数据为  X hX  行  wX  列,滤波核为  K (2hK+1)  行  (2wK+1)  列,使用  K  对  X  进行二维滤波的结果是  Y 。而直接采用二维循环的原始计算方法,需要进行  (2hK+1)×(2wK+1)  次乘法计算和  (2hK+1)×(2wK+1)1  次加法计算。计算的时间复杂度是  O(wKhK)  的。

如果  K  是可分离核,可以写成列向量  Kvertical  和行向量  Kvertical  相乘的形式,即  K=Kvertical×Khorizontal 。那么在计算滤波结果  Y  的时候,可以先用  Khorizontal  对  X  进行行滤波计算,将计算结果保存到  Z  中,计算  Z  中的每一个数值需要  (2wK+1)  次乘法计算和  2wK  次加法计算。再使用  Kvertical  对  Z  进行列滤波计算,得到最终结果  Y 。在  Z  的基础上计算  Y  中的每一个数值需要  (2hK+1)  次乘法计算和  2hK  次加法计算。总的来说,根据  X  计算  Y  中的一个数值,需要进行  (2hK+2wK+2)  次乘法计算和  2hK+2wK  次加法计算。计算的时间复杂度从  O(wKhK) 降至  O(wK+hK)

列滤波的过程还可以考虑内存访问的局部性原则,以提高程序的运行效率。

可分离核的实现方法和列滤波的内存访问加速的实现方法,都需要消耗额外的内存,用空间复杂度的提高换取时间复杂度和效率的改进。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值