用于图像处理的 OpenCV 中的局部敏感散列

Locality Sensitivy Hashing in OpenCV for image processing

这是我的第一个图像处理应用程序,所以请善待这个肮脏的农民。

申请:

我想实现一个快速应用程序(性能至关重要 甚至超过准确性)给定一张包含电影海报的照片(由手机拍摄 phone)找到给定数据集中最相似的照片和 return 相似度得分。数据集由相似的图片组成(手机拍摄 phone,包含电影海报)。图像可以有不同的大小、分辨率,并且可以从不同的角度拍摄(但没有旋转,因为海报应该总是向右)。

任何关于如何实现此类应用程序的建议都被广泛接受。

OPENCV 中的特征描述:

我从未使用过 OpenCV,但我阅读过 this tutorial about Feature Detection and Description 的 OpenCV。

据我了解,这些算法应该找到关键点(通常是角)并最终定义描述符(描述每个关键点并用于匹配两个不同的图像)。我使用 "eventually" 因为其中一些(例如 FAST)仅提供关键点。

最相似的图像问题和 LSH:

以上问题没有解决问题"given an image, how to find the most similar one in a dataset in a fast way"。为了做到这一点,我们都可以使用之前任何算法获得的关键点和描述符。上述问题似乎 nearest neighbor problem and Locality Sensitive Hashing 是一种快速且流行的解决方案,用于在高维空间中找到该问题的近似解。

问题:

我不明白的是如何在 LSH 中使用任何先前算法(即关键点和描述符)的结果。

这个问题有什么实现吗?

我将提供一个超出 OpenCV 库范围的一般性答案。


引用这个answer

descriptors: they are the way to compare the keypoints. They summarize, in vector format (of constant length) some characteristics about the keypoints.

话虽如此,我们可以imagine/treat(几何)描述符作为D维space中的点。所以总的来说,所有的描述符都是 D 维 space 中的点。例如,对于 GIST,D = 960。

所以实际上描述 描述 图像,使用比整个图像更少的信息(因为当你有 10 亿张图像时,大小很重要)。它们充当图像的代表,因此我们代表图像处理它们(因为它们是 easier/smaller 来处理)。


您提到的问题 Nearest Neighbor problem. Notice that an approximate version of this problem can lead to significant speed ups, when D is big (since the curse of dimensionality will make the traditional approaches, such as a kd-tree 非常慢,在 N(点数)方面几乎是线性的。

解决 NN 问题(优化问题)的算法通常是通用的。他们可能不关心数据是否是图像、分子等,例如我对两者都使用了我的 kd-GeRaF。结果,算法期望 D 维 space 中的 N 个点,因此您可能想说 N 个描述符。

检查我对 LSH 的回答(这指向一个很好的实现)。


编辑:

LSH 期望输入 N 个维度为 D 的向量并给定一个查询向量(在 D) 和范围 R,将从查询向量中找到位于此范围内的向量。

因此,我们可以说每个图像仅由一个向量表示,例如 SIFT 格式。

你看,LSH 实际上并没有直接解决 k-NN 问题,但它在一个范围内搜索(并且可以给你 k-NN,如果它们在范围内)。阅读更多关于 R 的内容,在实验部分,高维近似最近邻 kd-GeRaFFLANN直接求解k-NN问题