首页 > 搜索 > 引导滤波公式算法,导向滤波算法的实现

引导滤波公式算法,导向滤波算法的实现

互联网 2020-10-25 21:25:09
在线算命,八字测算命理

由上篇导向滤波算法分析,根据(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。

/* Cumulative image of the multiplication of p1.*p2. p1 and p2 can be the same pointer and it becomes square cumulative image. The returned cumulative image MUST be freed by the caller! */template BOOL MultiplyCumImage(T1 *p1, T2 *p2, T3 **ppCum){long i, j;long Width = GetWidth();long Height = GetHeight();long integral_len = (Width + 1)*(Height + 1);// Only allocate cumulative image memory when *ppCum is NULLif (*ppCum == NULL){try { *ppCum = new T3[integral_len]; }catch (CException *pe){pe->Delete();return FALSE;}}memset(*ppCum, 0, sizeof(T3)*integral_len);// The cumulative values of the leftmost and the topmost pixels are always 0.for (i = 1; i
免责声明:非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件12小时内删除。

相关阅读

一周热门

查看更多