图像下采样性能

Posted

技术标签:

【中文标题】图像下采样性能【英文标题】:Image downsampling performance 【发布时间】:2017-03-23 10:56:46 【问题描述】:

我正在研究图像识别(标记检测),并正在研究图像降采样预识别以提高性能。推理是我将对图像进行下采样,在其上运行检测算法,然后使用下采样因子插入标记坐标。我认为下采样成本将是微不足道的,因为它一直由我们的 gpu 完成。

所以我尝试使用 opencv 进行下采样,发现不仅没有得到任何改进,而且实际上花了更长的时间。然后我认为这是因为我正在让 cpu 做到这一点,所以我研究了使用 opengl mipmap 甚至着色器进行下采样,但从我所读到的内容来看,它仍然是一项代价高昂的任务,需要数十甚至数百毫秒才能将普通图像减半决议。

我的问题是,如果连续进行下采样很容易(想想在任何图像查看器上调整图像大小或在视频游戏中调整任何纹理),为什么使用最常见的方法会如此缓慢?是有什么秘诀还是我没看懂?

【问题讨论】:

你的纹理有多大?您如何将它们上传到 GL API 并读回结果?完全有可能是上传和回读成本是昂贵的部分,而不是下采样本身。 @solidpixel 通常做 1280x720 -> 640x480。使用 glTexImage2D 从 ram 加载它,生成 mipmaps(glGenerateMipmap),然后使用 glGetTexImage 获取第二个 mipmap @AlexButera 那么为什么需要glGetTexImage?这就是您的方法缓慢的确切原因。 AFAIR,您始终可以显式提供所需的 mipmap 级别,而无需来回移动像素数据并创建新的纹理对象。 您使用的是桌面 OpenGL 还是 OpenGL ES? @NicolBolas ES 1.1 【参考方案1】:

您可以将图像设置为纹理并在四边形上使用此纹理。更改纹理坐标,您将能够对图像进行任何转换。这是非常快速的方法。这里的瓶颈是将图像从主机复制到设备并返回。

【讨论】:

没有纹理过滤能够修复任何高于 2:1 下采样的损坏。单次通过更高的下采样率开始丢弃数据而不是过滤数据。 这是什么意思?什么是四边形?你说的是opengl吗? 是的,我的意思是 OpenGL。将图像作为纹理上传到 GPU 内存,将其绑定到四边形并将其绘制到缓冲区,然后将结果复制回来。

以上是关于图像下采样性能的主要内容,如果未能解决你的问题,请参考以下文章

下采样与上采样

对图像进行上采样和下采样的最佳方法

opencv学习-图像金字塔-上采样和下采样

使用 Neon 将图像下采样 3 的算法

图像的上采样与下采样

图像的上采样(up-sampling)和下采样(down-sampling)