两张图片相似度比较


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 =  pxColor-2 > avgValue ? 0:1;
				//trace(pxColor + "----" +avgValue);
				hashArr.push(value);
  			}
  			return hashArr;
		}

	}
	
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python可以使用Image模块和OpenCV库来比较两张图片相似度。以下是一种常见的方法: 首先,使用Image模块将两张图片加载为Image对象: from PIL import Image image1 = Image.open("image1.jpg") image2 = Image.open("image2.jpg") 接下来,将图片转换为灰度图像,这样可以减少比较的复杂度: image1_gray = image1.convert("L") image2_gray = image2.convert("L") 然后,可以使用numpy库将图像转换为数组,并进行进一步的处理。使用OpenCV库计算图像的差异度量,例如均方差或结构相似性指数(SSIM): import cv2 import numpy as np array1 = np.array(image1_gray) array2 = np.array(image2_gray) # 计算均方差 mse = np.mean((array1 - array2) ** 2) # 计算结构相似性指数 ssim = cv2.SSIM(array1, array2) 最后,根据不同的应用需求,可以仅根据均方差或者结构相似性指数来判断图片相似度。均方差越小,说明图片越相似;而结构相似性指数越接近1,说明图片越相似。 这只是其中一种比较图片相似度的方法,Python还有其他库和方法可以实现类似功能。 ### 回答2: Python可以使用一些图像处理和计算机视觉库来比较两张图片相似度,下面我将介绍其中的几个库。 1. PIL库:Python Imaging Library(PIL)是一个用于图像处理的库,可以加载、处理和保存多种格式的图像。可以使用PIL库来计算两张图片的直方图,并通过比较直方图来判断相似度。 2. OpenCV库:OpenCV是一个开源计算机视觉库,提供了很多用于图像处理的函数和算法。可以使用OpenCV库来计算两张图片之间的结构相似性指数(SSIM),该指数可以评估两张图片在亮度、对比度和结构等方面的相似程度。 3. scikit-image库:scikit-image是一个用于图像处理的Python库,提供了很多图像处理和计算机视觉的功能。可以使用scikit-image库来计算两张图片之间的结构相似性指数(SSIM)和均方误差(MSE),从而评估图片相似度。 4. perceptual哈希算法:perceptual哈希算法是一种可以计算图片相似度的算法,它通过计算两张图片哈希值并比较它们的相似程度来判断图片相似度。Python中有一些开源的算法库可以使用,如DHash、AHash和PHash。 总之,Python提供了多种图像处理和计算机视觉库可以用来比较两张图片相似度。具体选择哪个库要根据实际需求和数据特点来决定,可以根据图片的特点、计算速度和准确度等因素来选择合适的方法。 ### 回答3: 在Python中,我们可以使用OpenCV库来比较两张图片相似度。OpenCV是一个开源的计算机视觉库,提供了一系列用于图像处理和计算机视觉任务的函数。下面是一个简单的例子来演示如何使用OpenCV比较两张图片相似度: ```python import cv2 # 读取两张图片 image1 = cv2.imread('image1.jpg') image2 = cv2.imread('image2.jpg') # 确保两张图片有相同的尺寸 image1 = cv2.resize(image1, (200, 200)) image2 = cv2.resize(image2, (200, 200)) # 将图片转换为灰度图像 gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) # 计算两张图片的结构相似度指数(Structural Similarity Index,SSIM) ssim = cv2.compareSSIM(gray1, gray2) # 打印相似度 print("The SSIM between image1 and image2 is", ssim) ``` 上述代码中,我们首先使用`cv2.imread`函数读取两张图片,并使用`cv2.resize`函数将它们的尺寸调整为相同大小。然后,我们使用`cv2.cvtColor`函数将其转换为灰度图像,因为相似度比较通常使用灰度图像而非彩色图像。 最后,我们使用`cv2.compareSSIM`函数计算了两张图片的结构相似度指数(SSIM)。SSIM是一种用于比较两张图像相似度的指标,其值在0到1之间,值越接近1表示两张图片越相似。 需要注意的是,为了得到准确的相似度值,我们需要确保两张图片在尺寸上相同,以及选择合适的图像比较算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值