快速和简单的图像哈希算法(Fast and simple image hashing algorit

2019-06-26 01:10发布

我需要一个(优选简单而快速的)图像哈希算法。 哈希值在查找表中使用,而不是密码。

一些图像是“计算机图形” - 即纯色填充rects,光栅化文本和等,而也有“摄影”图像 - 含有丰富的色彩光谱,大部分是光滑,有合理的噪声振幅。

我也想在哈希算法能够被应用于特定的图像部分。 我的意思是,该图像可以被划分成的网格单元,并且每个单元的散列函数应该仅取决于该单元的内容。 这样一个可以迅速发现,如果两幅图像的公共区域(如果他们适当地对齐)。

注:我只需要知道,如果两个图像(或他们的部分)是相同的 。 也就是说,我并不需要匹配类似的图像,有一个在特征识别,关联和其它DSP技术没有必要。

我不知道什么是首选的散列算法。

为“摄影”刚刚图像异或网格单元内的所有像素是确定更多或更少。 针对不同的图像相同的散列值的概率是相当低的,特别是因为(近白色)噪声的存在打破了所有的潜在对称性。 加上这样的哈希函数的频谱看起来不错(任意值,可以用几乎相同的概率)。

但这样一个天真的算法可能无法与“人造”的图形使用。 相同的像素,重复图案,几何不变性偏移是这样的图像非常普遍。 异或所有的像素将与偶数相同像素的任何图像得到0。

使用类似CRT-32看起来有点前途,但我想弄清楚出的东西更快。 我考虑迭代公式,每个新的像素变异的当前散列值,如下所示:

hashValue = (hashValue * /*something*/ | newPixelValue) % /* huge prime */

做模素数大概应该提供一个良好的分散性,使我对这个选项倾斜。 但是,我想知道是否有更好的varians。

提前致谢。

Answer 1:

如果你想让它非常快,你应该考虑的像素的随机子集,以避免读取整个图像。 接着,计算在值中的那些像素的序列的散列函数。 的随机子集应通过与固定的种子,使得相同的图像产生相同的子集,并因此相同散列值的一个确定的伪随机数发生器来选择。

这甚至应该进行人工图像的相当良好。 但是,如果你有彼此少量像素的图像不同,这将会给散列冲突。 更多的迭代提供更好的可靠性。 如果是这样的情况下,例如,如果你的图片设置很可能有对与一个不同的像素,您必须阅读每一个像素来计算哈希值。 以用伪随机系数的简单线性组合,甚至会进行人工图像不够好。

一种简单的算法的伪代码

Random generator = new generator(2847)  // Initialized with fixed seed
int num_iterations = 100

int hash(Image image) {
    generator.reset()   //To ensure consistency on each evaluation
    int value = 0
    for num_iteration steps {
        int nextValue = image.getPixel(generator.nextInt()%image.getSize()).getValue()
        value = value + nextValue*generator.nextInt()
    }
    return value
}


Answer 2:

看看这个教程对phash算法http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html这是用来查找紧密匹配的图像。



文章来源: Fast and simple image hashing algorithm