我需要一个(最好是简单而快速的)图像哈希算法。哈希值用于查找表,而不是用于加密。
其中一些图像是“计算机图形” - 即填充的实色矩形、栅格化文本等,而也有“摄影”图像 - 包含丰富的颜色谱,大多数平滑,噪声幅度合理。
我还希望哈希算法能够应用于特定的图像部分。我的意思是,可以将图像分成网格单元,并且每个单元的哈希函数应仅取决于该单元的内容。这样,如果两个图像的公共区域对齐,则可以快速发现。
注意:我只需要知道两个图像(或它们的部分)是否完全相同。也就是说,我不需要匹配相似的图像,也不需要进行特征识别、相关性和其他DSP技术。
我想知道首选的哈希算法是什么。
对于“摄影”图像,仅对网格单元内的所有像素进行XOR运算就足够了。不同图像具有相同哈希值的概率非常低,尤其是因为(几乎白色的)噪声存在破坏所有潜在对称性。此外,这种哈希函数的频谱看起来很好(几乎具有相同的可能性)。
但是,这样的简单算法可能无法处理“人工”图形。对于这种图像,相同像素、重复的模式、几何偏移不变性非常普遍。对所有像素进行XOR运算将为任何具有相同像素数量的图像提供0。
使用类似CRT-32的东西似乎有一定的希望,但我想找出更快的方法。我考虑过迭代公式,每个新像素都会改变当前哈希值,就像这样:
hashValue = (hashValue * /*something*/ | newPixelValue) % /* huge prime */
对质数取模可能会得到更好的分散效果,因此我倾向于这个选项。但我想知道是否有更好的变体。
提前感谢。