基于 GPU 的拉普拉斯金字塔

问题描述 投票:0回答:2

我已经使用纯 C++ 实现了一种用于无缝混合的图像混合方法。现在我想将此代码转换为 GPU(使用适用于移动设备的 OpenGL ES 2 着色器)。基本上,该方法为每个图像创建高斯金字塔和拉普拉斯金字塔,然后将其从低分辨率到顶部组合(另请参阅 Burt 等人 1983 年的论文“The Laplacian Pyramid as a Compact Image Code”)。

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

我已经在寻找处理基于 GPU 的金字塔的论文,但没有找到真正有用的东西。

  1. 如何为 GPU 高效实现这样的金字塔?
  2. 是否可以计算高斯/拉普拉斯金字塔级别而不迭代前面的级别?

问候,

编辑 似乎没有“好的”方法可以在 GPU 上完全计算拉普拉斯金字塔,除非使用两个通道(一个用于符号,一个用于值),这两个通道不支持有符号类型(例如 ARB_texture_float)或大于字节的类型当图像的数据范围在[0..255]之间时。我的拉普拉斯金字塔在具有 ARB_texture_float 扩展的 GPU 上完美运行,但如果没有扩展(以及一些压缩范围的调整),金字塔会由于范围压缩而变得“错误”。

image-processing shader opengl-es-2.0 gaussian laplacian
2个回答
6
投票
    如果纹理是无符号整数,实现拉普拉斯金字塔的最安全方法是存储两个金字塔 - 一个金字塔包含拉普拉斯的梯度大小,另一个金字塔存储该位置像素的符号。
  1. 是的。高斯或拉普拉斯金字塔中的任何级别都有一个基于您要计算的 sigma 值的封闭形式解。考虑以 sigma = (2/3) 间隔计算的 LoG 金字塔的基本情况。金字塔的第一层具有 sigma 2/3,只需与具有 sigma 2/3 的 5x5 LoG 滤波器进行卷积即可生成。使用相同滤波器的第二个卷积生成具有 sigma 4/3 的 LoG 图像,最后第三个具有 sigma 6/3 或 2,因此我们对图像进行二次采样以生成金字塔的下一个整数级别。如果您想计算 sigma 2 处图像的 LoG,则不需要 sigma 2/3 和 4/3 处的级别 - 只需对图像进行二次采样,然后与 sigma 1 处的 LoG 滤波器进行卷积即可。
  2. 如果您想计算 sigma = 20 处的 LoG,请对图像进行四次采样(16 个像素块变为 1 个像素)以获得 sigma 16 图像,然后使用 sigma 4/3 LoG 滤波器进行一次卷积。


0
投票

还有一些研究论文在 Vulkan、openCL 和 openGL 中实现了拉普拉斯金字塔,但不幸的是他们没有提供他们使用的代码。

© www.soinside.com 2019 - 2024. All rights reserved.