您的位置:首页 > 其它

两张图片相似度比较

2016-11-01 09:04 435 查看
package  {
import flash.display.BitmapData;
import flash.geom.Matrix;
public class HashClass {

public function HashClass() {
// constructor code
}
public function compareBitmapData(bmpData1:BitmapData,bmpData2:BitmapData):Number{
var str1 =  process(bmpData1);
var str2 =  process(bmpData2);
var arr1:Array = str1.split("");
var arr2:Array = str2.split("");
var diffCount:int=0;
for(var i1:int=0; i1<64;i1++){
if(arr1[i1]==arr2[i1]){
diffCount=diffCount+1;
}
}

return diffCount/64;
}
public static function process(bmpData:BitmapData):String{
//processing the image
//   trace("Start processing...\n");
//scaling and converting
var resizedData:BitmapData = reduceSize(bmpData,8,8);
//转换为灰度
var greyBmp:BitmapData = reduceColor(resizedData);
//计算灰度平均值
var avgGrey:uint = calcAvgGrey(greyBmp);
//trace("Average GreyScale:0x"+avgGrey.toString(16)+"\n");

//比较灰度值与平均值,建立哈希指纹
var hashArr:Array = calcAvgHash(resizedData, avgGrey);
//   trace("hashArr: ",hashArr.join(""));
return hashArr.join("");
}

public static function reduceSize(source:BitmapData,width:Number = 8, height:Number=8):BitmapData{
var newData:BitmapData = new BitmapData(width,height);
var matrix:Matrix = new Matrix();
//缩小至 8x8
matrix.scale(newData.width/source.width, newData.height/source.height);
newData.draw(source,matrix);

return newData;
}

public static function reduceColor(source:BitmapData):BitmapData{
var result:BitmapData = new BitmapData(source.width,source.height);
for(var i:int = 0; i < source.height; i++){
for(var j:uint = 0; j < source.width; j++){
var color:uint = source.getPixel(i, j);
var red:uint = (color & 0xFF0000) >> 16;
var green:uint = (color & 0x00FF00) >> 8;
var blue:uint = (color & 0x0000FF) >> 0;
//trace(red+"+"+green+"+"+blue);
//var bwColor:uint = (red + green + blue) / 3;
var bwColor:uint = (red * 30 + green * 59 + blue * 11) / 100;
// puts the average in each channel
bwColor = (bwColor << 16) + (bwColor << 8) + bwColor;
result.setPixel(i, j, bwColor);
}
}
return result;
}
/*
public static function calcAvgGrey(bmpData:BitmapData):uint{
var vecGrey:Vector.<uint> = bmpData.getVector(bmpData.rect);
var total:uint = 0;
var length:uint = vecGrey.length;
for(var i:int = 0; i< length;i++){
total += (vecGrey[i] & 0x00FFFFFF);
}
return uint(total/vecGrey.length);
}

//计算哈希
public static function calcAvgHash(bmpData:BitmapData, avgValue:uint):Array {
var vecGrey:Vector.<uint>  = bmpData.getVector(bmpData.rect);
var length:uint = vecGrey.length;
var hashArr:Array = [];
for(var i:int = 0; i< length;i++) {
//ARGB 32位数据,只取RGB
var pxColor:uint = vecGrey[i] & 0x00FFFFFF;
//是否小于灰度均值,小于记0,否则记0
var value:uint =  pxColor > avgValue ? 0:1;
hashArr.push(value);
}
return hashArr;
}*/
//求平均灰度值
public static function calcAvgGrey(bmpData:BitmapData):uint{
var vecGrey:Vector.<uint> = bmpData.getVector(bmpData.rect);
var total:uint = 0;
var length:uint = vecGrey.length;
for(var i:int = 0; i< length;i++){
var color:uint = vecGrey[i];
var red:uint = (color & 0xFF0000) >> 16;
var green:uint = (color & 0x00FF00) >> 8;
var blue:uint = (color & 0x0000FF) >> 0;
var bwColor:uint = (red * 30 + green * 59 + blue * 11) / 100;
total = total + bwColor;
}
return uint(total/vecGrey.length);
}

//计算哈希
public static function calcAvgHash(bmpData:BitmapData, avgValue:uint):Array {
var vecGrey:Vector.<uint>  = bmpData.getVector(bmpData.rect);
var length:uint = vecGrey.length;
var hashArr:Array = [];
for(var i:int = 0; i< length;i++) {
var color:uint = vecGrey[i];
var red:uint = (color & 0xFF0000) >> 16;
var green:uint = (color & 0x00FF00) >> 8;
var blue:uint = (color & 0x0000FF) >> 0;
var bwColor:uint = (red * 30 + green * 59 + blue * 11) / 100;
//ARGB 32位数据,只取RGB
var pxColor:uint = bwColor;
//是否小于灰度均值,小于记0,否则记0  减2可以提高检测的容错性
var value:uint =  pxCo
97a3
lor-2 > avgValue ? 0:1;
//trace(pxColor + "----" +avgValue);
hashArr.push(value);
}
return hashArr;
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: