Iphone 硬件加速的图像比较/搜索?

Iphone 硬件加速的图像比较/搜索?,iphone,ios,image-processing,opengl-es,Iphone,Ios,Image Processing,Opengl Es,我需要找到一个较小图像在较大图像中的位置。较小的图像是较大图像的子集。要求还包括像素值可能略有不同,例如,如果图像是由不同的JPEG压缩生成的。 我已经通过使用CPU比较字节实现了这个解决方案,但我现在正在研究是否有可能加快这个过程。 我能不能利用OpenGLES和iPhone GPU 注意:图像是灰度的。@Ivan,这是视频压缩中的一个相当标准的问题(在前一帧中查找当前宏块的位置)。您可以使用像素差异度量,例如abs差异之和(SAD)、平方差异之和(SSD)或哈达玛变换差异之和(SATD)。我

我需要找到一个较小图像在较大图像中的位置。较小的图像是较大图像的子集。要求还包括像素值可能略有不同,例如,如果图像是由不同的JPEG压缩生成的。 我已经通过使用CPU比较字节实现了这个解决方案,但我现在正在研究是否有可能加快这个过程。 我能不能利用OpenGLES和iPhone GPU


注意:图像是灰度的。

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

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

感谢您提供了这个详尽的答案!现在我在做abs差值之和。我不是在处理视频。有点具体。我从一个服务中获得两张图像,我需要能够在较小图像所在的确切位置放大较大的图像(然后用户可以随意缩小)。我没有提到的是,较小的图像可以有不同的分辨率,所以我几乎粗暴地强制所有分辨率,直到找到匹配。我相信这可以在GPU上并行化?但我希望我能知道从哪里开始研究如何进行比较。@IvanKovacevic-比较本身可以在GPU上使用两个图像的差异混合(例如,我的GPUImage框架将非常简单地完成这项工作),通过获取结果的平均亮度(同样,可以在GPU上执行的操作),可以找到差异的相对度量。一种更稳健的方法可能是使用功能匹配,但这需要更多的编码工作才能完成。感谢Brad,您的框架看起来棒极了!我将尝试混合和亮度的技术,但是我有点怀疑瓶颈将是在GPU中发送/初始化图像,因为我需要逐像素移动原始图像,并创建与子图像(我正在比较)大小相同的裁剪图像,然后将两者发送到您的diff混合过滤器。也许可以在GPU上编写一个自定义过滤器来完成所有这些工作?我的问题有点过于宽泛,所以我认为这个答案是正确的。布拉德·拉森的评论也非常有用!谢谢你详尽的回答!现在我在做abs差值之和。我不是在处理视频。有点具体。我从一个服务中获得两张图像,我需要能够在较小图像所在的确切位置放大较大的图像(然后用户可以随意缩小)。我没有提到的是,更小的图像可以是我