我在图像上运行一个滑动窗口(类似于卷积内核)并提取每个窗口的平均值/颜色直方图。然而,由于数据是非常高的维度,我希望将其作为签名哈希,因此我可以通过聚合窗口来执行近似的最近邻图像搜索。
>>> means = cv2.mean(roi) #roi = window
>>> means
(181.12238527002307, 199.18315040165433, 206.514296508391, 0.0)..... => **some numeric hash**
哪种哈希算法适合这种情况?我尝试过Md5和SHA-1,但这些都是加密的,可能不适合k-NN。
我读过有关MinHash和SimHash的内容,但不确定它们是否适合我的用例。有什么建议吗?
答案 0 :(得分:1)
Locality Sensitive Hashing(LSH)是您的理想选择。根据 "Near-Optimal Hashing Algorithms for Approximate Nearest Neighbor in High Dimensions" (by Alexandr Andoni and Piotr Indyk)" ,它适用于在高维空间中执行近似搜索。
LSH中使用的散列函数的特征是,对于彼此接近的特征向量,它们的碰撞概率高于远离的特征向量。加密哈希函数不具备此属性。使用加密哈希,即使特征向量中的非常小的变化也会对哈希值产生广泛的变化。
OpenCV FLANN有LSH的实现。上述论文的作者也提供了一个实现here。
话虽如此,我建议您在数据集上评估OpenCV FLANN中的其他算法,以便选择最佳算法。
关于这些功能,您基本上使用的是对照明非常敏感的颜色信息。在你的情况下可能是光照无关紧要。如果您可以尝试其他功能描述符(SIFT / SURF,ORB,Brief等等)并使用不同的算法评估其性能,那就更好了。