目标
找到一种检查 2 个图像是否相似的好方法,比较它们的哈希配置文件。哈希是一个包含0 和 1 值的简单数组。
简介
我有 2 张图片。它们是相同的图像,但有一些细微差别:一个具有不同的亮度、旋转和拍摄。
我想要做的是创建一个 Javascript 方法来比较 2 个图像并计算一个百分比值来说明它们的相似程度。
我所做的
在将 2 张图片上传到 html5 画布以获取它们的图像数据后,我使用了pHash算法 (www.phash.org) 来获取它们的哈希表示。
哈希是一个包含 0 和 1 值的数组,它以“简化”形式重新创建图像。
我还创建了一个 JS 脚本,它生成一个带有黑色单元格的 html 表格,其中数组包含 1。
结果是以下屏幕截图(图像是梵高图片):
现在,我应该做的是比较两个数组以获得百分比值,以了解它们相似的“多少”。
我发现谷歌搜索的大部分哈希 Javascript 算法已经有一个比较算法:汉明距离算法。它非常简单和快速,但不是很精确。事实上,汉明距离算法说我截图中的 2 张图片有67% 的相似度。
问题
从 2 个长度相同的简单数组开始,填充 0 和 1 值:什么是更精确地确定相似度的好算法?
NOTES
- 纯 Javascript 开发,没有第三方插件或框架。
- 当两幅图像相同但它们非常不同(强烈旋转、完全不同的颜色等)时,无需复杂的算法来找到正确的相似性。
谢谢
相码
// 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 < array.length; i++)。