您可以使用n
随机投影将 pHash 空间拆分为2^n
桶,然后最有可能从同一个桶中找到相似的图像。您甚至可以使用汉明权重为 1 的所有 64 个可能整数对哈希进行异或运算,以方便地检查相邻的桶,并确保您找到所有近似匹配项。
仅当您对哈希值几乎相同(小汉明距离)的图像感兴趣时,这才有效。如果您想容忍更大的汉明距离(例如 8),那么高效准确地找到所有匹配项会变得很棘手。通过 GPU扫描整个表,我获得了非常好的性能,即使我 3 岁的笔记本电脑的 GT 650M 也可以检查 7 亿哈希/秒!
编辑 1:您可以将 64 位散列视为 64 维立方体上的单个角,如果将角坐标标准化为-1
和1
(这样它的中心位于原点),数学会更容易。您可以将图像表示为大小m
矩阵(一行/图像,一位哈希/列)。M
m x 64
将其拆分为2^n
不同组的最简单方法是生成n
64 维向量v_0, v_1, ..., v_n
(从正态分布 N(0,1) 中选择每个向量元素),这可以表示为V
大小矩阵64 x n
(一列/向量)。正如随机投影中提到的那样,可能会执行正交性,但我将在此处跳过它。
现在通过计算A = (M * V) > 0
得到m x n
矩阵(一个图像/行,一个投影/列)。接下来将每一行的二进制表示转换为一个数字,您会得到2^n
不同的可能性,并且相似的哈希最有可能最终出现在同一个桶中。
该算法适用于数据的任何正交表示(例如SURF特征),而不仅仅是二进制字符串。我确信二进制哈希有更简单(计算效率更高)的算法,但这是实现随机投影的一种方法。
我建议使用 XORring,因为如果图像没有相同的哈希值,则不能保证它们最终会出现在同一个存储桶中。通过检查与原始哈希的所有可能的小偏差,您可以查看哪些其他 bin 可能匹配。
在某种程度上,这类似于计算机游戏引擎如何将 2D 地图拆分为大小为 的单元格网格x
,然后要从一个点查找半径内的所有单元,x
您只需要检查 9 个单元格(包含该点的单元格 + 8周围的细胞)以获得 100% 准确的答案。