【问题标题】:Sum image intensities in GPU在 GPU 中求和图像强度
【发布时间】:2011-04-12 22:44:25
【问题描述】:

我有一个应用程序,我需要为大约 100 万张图像获取图像的平均强度。它“感觉”像是 GPU 片段着色器的工作,但片段着色器用于按像素进行局部计算,而图像平均是全局操作。

我考虑的一种方法是将图像加载到纹理中,应用 2x2 框模糊,将结果加载回 N/2 x N/2 纹理并重复直到输出为 1x1。但是,这需要 log n 次着色器应用程序。

有没有办法一次性完成?还是我应该分解并使用 CUDA/OpenCL?

【问题讨论】:

  • 我的应用程序正在将投影的 3D 模型与输入图像进行倒角匹配。我渲染包含模型轮廓边缘的图像,并且对于每个边缘像素,我使用查找表来查找输入图像中最近的边缘像素。然后我需要平均结果,它告诉我模型很适合数据。我尝试从 opengl 读取渲染的边缘像素并在 CPU 上进行倒角匹配,但读取操作是一个很大的瓶颈。我希望通过在 GPU 上完成所有操作并仅读取单个值,我会获得很大的加速。
  • (ctd) 因为我可以将查找表作为纹理传递,所以我可以在顶点着色器中进行查找,但我仍然存在将数据读回主内存的瓶颈。
  • 在此处查看类似问题-
    stackoverflow.com/questions/2944290/…
  • 没有什么能强迫你做 2x2 的模糊,例如你可以用 16x16 的盒子做模糊,然后将结果加载到 N/16 x N/16 纹理中。这样,您可以实现大幅加速和更少的复制操作......
  • 我们还必须考虑纹理复制操作。例如对于 4096x4096 图像,如果内核是 2x2 - 它需要 12 个内存复制操作,但对于 16x16 内核 - 它只是 3 个复制操作。这就是为什么我说需要进行实验检查什么内核大小是最佳的,因为最小化顺序操作会增加内存复制操作的总数,这可以摊销加速。

标签: opengl image-processing gpu glsl


【解决方案1】:

我的直觉告诉我尝试在 OpenCL 中实现。您可以通过将图像分解为定制的数据块,然后并行求和,来优化您的图像大小和图形硬件。确实可能非常快。

片段着色器非常适合卷积,但该结果通常写入 gl_FragColor ,因此它是有意义的。最终,您将不得不遍历纹理中的每个像素并对结果求和,然后在主程序中读回。生成图像统计数据可能不是片段着色器的设计目的,而且由于不能保证特定缓冲区位于 GPU 内存中,因此不清楚是否会获得主要的性能提升。

听起来您可能正在将此算法应用于实时运动检测场景或其他一些自动特征检测应用程序。从像素样本而不是整个图像计算一些统计数据然后构建机器学习分类器可能会更快。

祝你好运!

【讨论】:

  • 感谢您的回复。我会研究 OpenCL。
【解决方案2】:

求和运算是“归约”的一种特殊情况,这是 CUDA 和 OpenCL 库中的标准操作。 cuda demos page 上有一篇很好的文章。在 CUDA 中,Thrust 和 CUDPP 只是提供归约的两个库示例。我对 OpenCL 不太熟悉,但 CLPP 似乎是一个很好的库,可以提供减少。只需将您的颜色缓冲区复制到 OpenGL 像素缓冲区对象并使用适当的 OpenGL 互操作性调用来使该像素缓冲区的内存可在 CUDA/OpenCL 中访问。

如果必须使用 opengl API 完成(如原始问题所要求的那样),解决方案是渲染到纹理,创建纹理的 mipmap,并读取 1x1 纹理。您必须正确设置过滤(我认为双线性是合适的),但它应该接近正确的答案,模精度误差。

【讨论】:

    【解决方案3】:

    如果您喜欢坚持使用 GLSL,则不需要 CUDA。就像这里提到的 CUDA 解决方案一样,它可以直接在片段着色器中完成。但是,您需要 log(resolution) 绘制调用。 只需设置一个从原始图像中获取 2x2 像素样本的着色器,然后输出这些样本的平均和。结果是在两个轴上都具有一半分辨率的图像。重复此操作,直到图像为 1x1 像素。 一些注意事项:如果可用,请使用GL_FLOAT 亮度纹理,以获得更精确的总和。使用glViewport 将每个阶段的渲染区域分成四等分。然后结果会出现在帧缓冲区的左上角像素中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 2013-08-31
      相关资源
      最近更新 更多