【发布时间】:2017-12-31 01:06:58
【问题描述】:
目标
通过比较它们的 hash 配置文件,找到一种检查 2 张图片是否相似的好方法。哈希是一个简单的数组,包含0 和1 值。
简介
我有 2 张图片。它们是相同的图像,但有一些微小不同:一个具有不同的亮度、旋转和拍摄。
我想要做的是创建一个 Javascript 方法来比较 2 个图像并计算一个 百分比值,它告诉 它们有多少相似度。
我做了什么
在将 2 张图片上传到 html5 画布以获取它们的图像数据后,我使用 pHash 算法 (www.phash.org) 来获取它们的 hash 展示。
哈希是一个包含 0 和 1 值的数组,它以“简化”形式重新创建图像。
我还创建了一个 JS 脚本,它生成一个带有黑色单元格的 html 表格,其中数组包含 1。
结果是以下屏幕截图(图像是梵高图片):
现在,我应该做的是比较两个数组以获得百分比值,以了解它们的“相似程度”。
我发现谷歌搜索的大部分哈希 Javascript 算法已经有一个比较算法:汉明距离算法。它非常简单和快速,但不是很精确。事实上,汉明距离算法表明我的截图中的 2 张图像具有 67% 的相似度。
问题
从 2 个长度相同的简单数组开始,填充 0 和 1 值:有什么好的算法可以更精确地确定相似度?
注意事项
- 纯 Javascript 开发,无第三方插件或框架。
- 当 2 张图像相同但它们非常不同(强烈旋转、完全不同的颜色等)时,无需复杂的算法来找到正确的相似度。
谢谢
PHASH 代码
// Size is the image size (for example 128px)
var pixels = [];
for (var i=0;i<imgData.data.length;i+=4){
var j = (i==0) ? 0 : i/4;
var y = Math.floor(j/size);
var x = j-(y*size);
var pixelPos = x + (y*size);
var r = imgData.data[i];
var g = imgData.data[i+1];
var b = imgData.data[i+2];
var gs = Math.floor((r*0.299)+(g*0.587)+(b*0.114));
pixels[pixelPos] = gs;
}
var avg = Math.floor( array_sum(pixels) / pixels.length );
var hash = [];
array.forEach(pixels, function(px,i){
if(px > avg){
hash[i] = 1;
} else{
hash[i] = 0;
}
});
return hash;
汉明距离码
// hash1 and hash2 are the arrays of the "coded" images.
var similarity = hash1.length;
array.forEach(hash1, function(val,key){
if(hash1[key] != hash2[key]){
similarity--;
}
});
var percentage = (similarity/hash1.length*100).toFixed(2);
注意:array.forEach 不是纯 JavaScript。将其视为: for (var i = 0; i
【问题讨论】:
-
请添加您拥有的代码。
-
您认为汉明距离的“不精确”是什么?这似乎是适合这项工作的工具。您是否有汉明距离不适用于您的示例?
-
如果你的汉明距离看起来不精确,那更有可能是你的哈希不够精确……汉明距离不能不精确,它完全是二元的。
-
pHash.org 是一个感知哈希算法库,您使用的是哪一个?以及如何?
-
我们需要查看您的哈希算法
标签: javascript phash