【问题标题】:GPU-based Laplacian Pyramid基于 GPU 的拉普拉斯金字塔
【发布时间】:2012-09-16 03:00:06
【问题描述】:

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

我的问题是拉普拉斯金字塔等级可以有负值,但我的设备不支持浮点或整数类型纹理(例如使用 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


    【解决方案1】:
    1. 如果纹理是无符号整数,实现拉普拉斯金字塔最安全的方法是存储两个金字塔 - 一个金字塔包含拉普拉斯的梯度幅度,另一个金字塔存储像素的符号地点。

    2. 是的。高斯或拉普拉斯金字塔中的任何级别都具有基于您要计算的 sigma 值的封闭形式解决方案。考虑以 sigma = (2/3) 的间隔计算的 LoG 金字塔的基本情况。金字塔的第一层有 2/3 的 sigma,只需用 5x5 LoG 滤波器和 2/3 的 sigma 卷积即可生成。使用相同滤波器的第二个卷积生成 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 滤波器进行一次卷积。

    【讨论】:

    • 感谢您的提示。我是否正确地计算了两次拉普拉斯金字塔(一次用于符号,一次用于绝对值)?
    • 重新考虑您的评论后,也可以在 alpha 通道中编码 RGB 的符号(我不使用)。这可能比计算 Pyramid 两次要慢,但它节省了在我的设备上也很稀疏的内存。
    • 使用 Alpha 通道是个好主意,现在您不需要计算金字塔两次或存储两个金字塔。通过过滤器计算拉普拉斯值并将其存储在有符号变量中。将有符号变量的 abs() 放入 r/g/b。将有符号变量除以存储在纹理中的值,将结果加 1,然后将其存储在 Alpha 通道中。如果 alpha 中的值为 0,则原始渐变为负,如果为 2,则渐变为正。
    猜你喜欢
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2021-11-28
    • 2019-04-13
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多