Javascript JS-如何检查两个图像(它们的散列)是否相似

Javascript JS-如何检查两个图像(它们的散列)是否相似,javascript,phash,Javascript,Phash,目标 找到一种很好的方法来检查两个图像是否与它们的哈希文件类似。散列是一个简单的数组,包含0和1个值 简介 我有两张照片。它们是相同的图像,但有一些差异:一个具有不同的亮度、旋转和拍摄。 我想做的是创建一个Javascript方法来比较这两幅图像,并计算一个百分比值,告诉它们有多相似 我所做的 在将这两幅图像上传到html5画布中以获取它们的图像数据之后,我使用了pHash算法(www.pHash.org)来获取它们的哈希值表示。 哈希是一个数组,包含0和1个值,以“简化”形式重新创建图像。 我

目标
找到一种很好的方法来检查两个图像是否与它们的哈希文件类似。散列是一个简单的数组,包含0和1个值

简介
我有两张照片。它们是相同的图像,但有一些差异:一个具有不同的亮度、旋转和拍摄。
我想做的是创建一个Javascript方法来比较这两幅图像,并计算一个百分比值,告诉它们有多相似

我所做的
在将这两幅图像上传到html5画布中以获取它们的图像数据之后,我使用了pHash算法(www.pHash.org)来获取它们的哈希值表示。
哈希是一个数组,包含0和1个值,以“简化”形式重新创建图像。
我还创建了一个JS脚本,该脚本生成了一个带有黑色单元格的html表,其中数组包含1。
结果是以下屏幕截图(图像为梵高图片):

现在,我要做的是比较这两个数组以获得一个百分比值,从而知道它们的相似程度。
我发现谷歌搜索的大部分散列Javascript算法已经有了一个比较算法:汉明距离算法。它非常简单和快速,但不是很精确。事实上,汉明距离算法表明我截图中的两幅图像有67%的相似性

问题
从两个长度相同的简单数组开始,填充0和1的值:有什么好的算法可以更精确地确定相似性

注释
-纯Javascript开发,无第三方插件或框架。
-当两幅图像相同但差异很大(强烈旋转、颜色完全不同等)时,无需复杂的算法即可找到正确的相似性。

塔克斯

相位代码

//Size是图像大小(例如128px)
var像素=[];
对于(变量i=0;i平均值){
散列[i]=1;
}否则{
散列[i]=0;
}
});

返回散列我正在使用blockhash,到目前为止它看起来相当不错,只有当一半的图片具有相同的背景颜色时才会出现误报,这是意料之中的=/

区块哈希可能比你的慢,但应该更准确

你所做的只是计算每个像素的灰度,然后将其与平均值进行比较,创建散列

BlockHash所做的是将图片分割成大小相等的小矩形,并平均其中像素的RGB值之和,并将其与4个水平中间点进行比较

因此,这是正常的,它需要更长的时间,但它仍然是相当有效和准确的

我用的是分辨率很好的图片,至少1000x800,使用16位。这将提供一个64个字符长的十六进制哈希。当使用同一个库提供的汉明距离时,当使用10个相似性阈值时,我看到了很好的结果


你使用灰度的想法一点也不坏。但是你应该平均出图像的各个部分,而不是比较每个像素。这样你就可以将缩略版本与原始版本进行比较,得到几乎相同的相位

我不知道这是否能奏效,但您可以比较数组之间的0和1的相似性:

const arr1 = [1,1,1,1,1,1,1,1,1,1],
      arr2 = [0,0,0,0,0,0,0,0,0,0],
      arr3 = [0,1,0,1,0,1,0,1,0,1],
      arr4 = [1,1,1,0,1,1,1,0,1,1]

const howSimilar = (a1,a2) => {
    let similarity = 0
    a1.forEach( (elem,index) => {
        if(a2[index]==elem) similarity++
    })
    let percentage = parseInt(similarity/arr1.length*100) + "%"
    console.log(percentage)
}

howSimilar(arr1,arr2) // 0%
howSimilar(arr1,arr3) // 50%
howSimilar(arr1,arr4) // 80%

请加上你的代码,你认为汉明距离是什么“不精确”?它似乎是这项工作的合适工具。你有没有一个例子说明汉明距离对你来说不太合适?如果你的汉明距离看起来不精确,那很可能是你的哈希不够精确。。。汉明距离不可能是不精确的,它是一个完美的二进制。pHash.org是一个感知哈希算法库,你在使用哪一个?怎么做呢?我们需要看看你的散列算法,基本上就是汉明距离(倒过来的)。这就是汉明距离。不幸的是,OP说他还想要别的东西。出于好奇,我实现了区块哈希算法。与我的脚本相比,结果的差异非常小,只有3%的差异。值得注意的是,我的算法比BlockHash快得多。在这里,添加了一些信息来帮助您。。。再不幸不过了。