移动 – 基于GPU的拉普拉斯金字塔

我已经实现了一种使用普通C进行无缝混合的图像混合方法.现在我想将此代码转换为GPU(使用OpenGL ES 2着色器用于移动设备).基本上,该方法为每个图像创建高斯和拉普拉斯金字塔,然后从低分辨率到顶部组合(另见文章“拉普拉斯金字塔作为紧凑图像代码”,来自Burt等,1983).

我的问题是拉普拉斯金字塔等级可以有负值,但我的设备不支持浮点或整数类型纹理(例如使用ORB_texture_float扩展).

我已经找过处理基于GPU的金字塔的文章,但没有找到真正有用的东西.

>如何有效地为GPU实现这样的金字塔?
>是否可以计算高斯/拉普拉斯金字塔等级而无需迭代前面的等级?

问候,

编辑
看起来好像没有“好”的方法来完全在GPU上计算拉普拉斯金字塔,除了使用两个传递(一个用于符号,一个用于值),它们不支持任何一种带符号的类型(例如ARB_texture_float)或大于字节的类型当图像的数据范围在[0..255]之间时.我的拉普拉斯金字塔在具有ARB_texture_float扩展的GPU上完美运行但没有扩展(并且一些调整以压缩范围)金字塔由于范围压缩而变得“错误”.

最佳答案
>如果纹理是无符号整数,那么实现拉普拉斯金字塔最安全的方法是存储两个金字塔 – 一个金字塔包含拉普拉斯运算符的梯度大小,另一个金字塔存储该位置像素的符号.
>是的.高斯或拉普拉斯金字塔中的任何级别都具有基于您要计算的西格玛值的封闭形式解决方案.考虑以sigma =(2/3)的间隔计算的LoG金字塔的基本情况.金字塔的第一层有sigma 2/3,只需用带有sigma 2/3的5×5 LoG滤波器进行卷积即可生成.具有相同滤波器的第二个卷积产生具有sigma 4/3的LoG图像,并且最后第三个具有sigma 6/3或2,因此我们对图像进行子采样以产生金字塔的下一个整数级别.如果要在sigma 2处计算图像的LoG,则不需要sigma 2/3和4/3处的级别 – 只需对图像进行一次子采样,然后使用带有sigma 1的LoG滤波器进行卷积.

如果你想在sigma = 20处计算LoG,则对图像进行四次子采样(16个像素块变为1个像素)以给出sigma 16图像,然后使用sigma 4/3 LoG滤波器进行一次卷积.

转载注明原文:移动 – 基于GPU的拉普拉斯金字塔 - 代码日志