由上篇导向滤波算法分析,根据(5)~(8)式就可以计算输出图像Q

  (5)

  (6)

  (7)

  (8)

其中,/ai和/bi的结果要计算所有覆盖了像素i的窗口Wk的ak和bk的平均值。除了用平均值,在实际应用中,我还看到过其他的计算/ai和/bi的方法。比如根据像素i在窗口Wk的位置,给予不同的权重。如果i距离窗口Wk的中心位置越远,则给予ak和bk越低的权重。如果i位于窗口中心,则ak和bk有最高的权重。最常用的就是用高斯分布来给予不同的权重。这样考虑到了附近像素距离远近对i影响的大小,最后的结果会更精确一些。

这里我还是用最简单的平均值的方法来计算/ai和/bi。我们前面已经假定了在窗口Wk内,ak和bk是常数,因此ak和bk只和Wk的位置有关。取Wk为半径为r的方形窗口,使窗口的中心像素位置遍历整个图像,那么就使Wk取到了不同的所有位置,在每个位置计算出相应的ak和bk。所有的ak和bk组成了和输入图像P相同长宽维度的数据集合,记为A和B。对于任意像素i,/ai和/bi即分别为以i为中心半径r的窗口Wk内A和B的数据均值,这不正是我们熟悉的图像均值模糊的算法吗?而图像均值模糊有几种比较成熟的快速算法,比如积分图算法和基于直方图的快速算法。只要有了A和B,就可以方便的应用均值模糊得出/ai和/bi,从而应用(8)计算出输出图像Q。

为了计算A和B,从(6)式看到,需要分别计算输入图像P和导向图G的均值模糊结果。而(5)式需要计算导向图G的方差,还有P和G的协方差。方差和协方差都涉及到乘积的求和计算,可以由下面的公式,通过积分图来计算。这两个公式很容易推导出来,就不赘述了。

一个平方和,一个乘积和都可以用积分图来计算。只是要注意当图像足够大的时候,要用合适的数据类型。假设像素的数据范围是0~255的整型,如果平方积分图用32位的整型数据,那么只能支持最大256x256大小的图像。超过这个大小,就必须要用64位的整型了。下面给出使用模板函数的乘积积分图函数,可以根据需要使用不同的数据类型。p1和p2是图像数据指针,当它们指向相同的数据时,这个函数就变成了平方积分图。注意积分图的长宽比原始数据的长宽都要大1。