我正在寻找一种方法来识别具有相同大小的类似 png 图像。这些图像不是完全相同的副本。例如,如果一个图像有鸟的剪贴画,而另一张图像具有相同的剪贴画但它是旋转的,我想确定它们都是相似的。我想用php编写一个算法。我已经用javasript试过了。我正在做的是将图像转换为base64并使用汉明距离比较两个值。但据我所知,这不会识别缩放、旋转等高级技术。那么我希望它编写一个算法来在 php 中做这些事情。有什么想法吗?这是我使用 javascript 和 html5 画布尝试过的。
function newFunction()
{
var imageHeight = image.naturalHeight;
var imageWidth = image.naturalWidth;
var image2Height = image2.naturalHeight;
var image2Width = image2.naturalWidth;
var data3=[];
var imageData = context.getImageData(0,0,imageWidth,imageHeight);
var image2Data = context2.getImageData(0,0,image2Width,image2Height);
var data = imageData.data;
var data2 = image2Data.data;
function _arrayBufferToBase64( buffer ) {
var binary = '';
var bytes = new Uint8Array( buffer );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
return window.btoa( binary );
}
//str = String.fromCharCode.apply(null, data); // "ÿ8É"
// str2 = String.fromCharCode.apply(null, data2); // "ÿ8É"
// to Base64
b64 = _arrayBufferToBase64(data);
b64_2 = _arrayBufferToBase64(data2 );
console.log("64 base"+b64_2);
//
var toReturn = 0;
var firstBytes =new Uint8Array(1024);
var secondBytes=new Uint8Array(1024);
var different=new Uint8Array(1024);
// firstBytes = Convert.FromBase64String(first64);
// secondBytes = Convert.FromBase64String(second64);
different = 0;
var mylength;
if(b64.length>b64_2.length)
{
mylength=b64.length;
}
else
{
mylength=b64_2.length;
}
for (var index = 0; index < mylength; index++) {
different = (b64[index] ^ b64_2[index]);
while (different != 0) {
toReturn++;
different &= different - 1;
}
}
var percentage=(toReturn/((image2Height*image2Width)*2))*100;
if(percentage >=100)
{
percentage=100;
}
alert("Difference is "+percentage+" to return" +toReturn + " data1 length"+data.length+ " data2 length"+data2.length);
}
此功能运行良好,没有任何错误。但它不会识别缩放和旋转等高级功能。给我一些想法如何使用 php 做到这一点。