【问题标题】:Hardware accelerated image comparison/search?硬件加速图像比较/搜索?
【发布时间】:2012-11-05 05:36:51
【问题描述】:

我需要在较大图像中找到较小图像的位置。较小的图像是较大图像的子集。还要求像素值可能略有不同,例如,如果图像是由不同的 JPEG 压缩产生的。 我已经通过使用 CPU 比较字节来实现该解决方案,但我现在正在研究加速该过程的任何可能性。 我可以以某种方式利用 OpenGLES 和 iPhone GPU 吗?

注意:图像是灰度的。

【问题讨论】:

    标签: iphone ios image-processing opengl-es


    【解决方案1】:

    @Ivan,这是视频压缩中的一个非常标准的问题(在前一帧中查找当前宏块的位置)。您可以使用像素差异度量,例如绝对差异之和 (SAD)、平方差异之和 (SSD) 或 Hadamard 变换差异之和 (SATD)。我假设您不是在尝试压缩视频,而是在寻找诸如水印之类的东西。在许多情况下,您可以使用梯度下降类型搜索来找到局部最小值(最佳匹配),根据经验观察,将图像(您的小图像)与相同的稍微偏移版本(匹配的位置没有'未准确找到)产生比与另一幅图像的随机部分相比更接近的度量。因此,您可以从对所有可能的偏移/位置(视频编码中的运动矢量)的空间进行相当粗略的采样,然后围绕最佳结果进行局部优化。局部优化通过将匹配与一定数量的相邻匹配进行比较,并移动到最好的那些,如果有的话比你当前的匹配更好,重复。这比蛮力(检查每个可能的位置)快得多,但它可能并非在所有情况下都有效(这取决于匹配的性质)。不幸的是,这种类型的算法不能很好地转化为 GPU,因为每一步都依赖于前面的步骤。它可能仍然值得;如果您检查例如 256x256 图像位置的 16 个邻居,则足以发送到 GPU 的并行计算,是的,它绝对可以在 OpenGL-ES 中完成。然而,这一切的答案实际上取决于您是在进行蛮力搜索还是局部最小化类型搜索,以及局部最小化是否适合您。

    【讨论】:

    • 感谢您提供详尽的回答!目前我正在做腹肌差异的总和。我不是在处理视频。这有点具体。我从服务中获得了两张图像,我需要能够在较小图像所在的确切点放大较大的图像(然后用户可以随意缩小)。我没有提到的是较小的图像可以具有不同的分辨率,所以我几乎会蛮力使用所有分辨率,直到找到匹配项。我相信这可以在 GPU 上并行化?但我希望我能知道从哪里开始研究如何完成。
    • @IvanKovacevic - 比较本身可以很容易地在 GPU 上使用两个图像的差异混合来完成(例如,我的 GPUImage 框架将非常简单地做到这一点),并且相对的差异度量可以通过获取结果的平均亮度来找到(同样,可以在 GPU 上执行的操作)。更强大的方法可能是使用特征匹配,但这需要更多的编码工作才能完成。
    • 感谢 Brad,您的框架看起来棒极了!我将尝试使用混合和亮度技术,但是我有点怀疑瓶颈将是在 GPU 中发送/初始化图像,因为我需要逐像素移动原始图像并创建相同大小的裁剪图像作为子图像(我正在与之比较),然后将两者都发送到您的差异混合过滤器。也许可以编写一个在 GPU 上完成所有这些的自定义过滤器?
    • 我的问题有点过于宽泛,所以我接受这个答案是正确的。 Brad Larson 的评论也很有用!
    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2012-12-02
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多