自动化测试中的图片相似度

上一篇 / 下一篇  2012-01-10 09:46:52

c++ opencv  VS python PIL   VS java BufferedImage
//=======================opencv============================= 
基本介绍: 
OpenCV的全称是:Open Source Computer Vision Library  。OpenCV于1999年由Intel建立,现在由Willow Garage提供支持。OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在LinuxWindows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法,最新版本是2.3。 
应用领域 
       1、人机互动 
  2、物体识别 
  3、图象分割 
  4、人脸识别 
  5、动作识别 
  6、运动跟踪 
  7、机器人 
opencv直方图比较: 
相关系数: 


卡方:

 
交集: 

 
巴氏距离: 


相似度的源码: 

/* 
引入opencv 
在项目属性的 
头文件目录和库文件目录 
分别加上OpenCV的头和库目录如 
包含目录: 
E:\code\vc2010\OpenCV2.2\include\opencv 
E:\code\vc2010\OpenCV2.2\include\ 
库目录: 
E:\code\vc2010\OpenCV2.2\lib 


*/ 
#include <cv.h> 
#include <highgui.h> 
using namespace cv; 

//直方图尺寸 
int HistogramBins = 256; 
float Range1[]={0,255}; 
float *HistogramRange=Range1; 


//两个比较图形对象 
IplImage *Image1=cvLoadImage("E:\\code\\python\\o_1.JPG",0); 
IplImage *Image2=cvLoadImage("E:\\code\\python\\o_2.JPG",0);
 

//两个直方图对象 
CvHistogram *Histogram1=cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY, &HistogramRange); 
CvHistogram *Histogram2=cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY, &HistogramRange);



//直方图 
cvCalcHist(&Image1,Histogram1); 
cvCalcHist(&Image2,Histogram2); 

//归一化直方图 
cvNormalizeHist(Histogram1,1); 
cvNormalizeHist(Histogram2,1); 

//相似度比较方法: 
printf(“相关系数: %.4f\n",cvCompareHist(Histogram1,Histogram2,CV_COMP_CORREL)); 
printf("卡方 : %.4f\n",cvCompareHist(Histogram1,Histogram2,CV_COMP_CHISQR)); 
printf("交集 : %.4f\n",cvCompareHist(Histogram1,Histogram2,CV_COMP_INTERSECT)); 
printf("巴氏距离 : %.4f\n",cvCompareHist(Histogram1,Histogram2,CV_COMP_BHATTACHARYYA)); 

/* 
接口参考 
http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm 
*/ 

//=======================python PIL============================= 
实现最简单,缺点是无论图片大小,采样点固定为768点, 看了pil的C源码库,写死在代码中, 
不过pil切割图片简单,大图可以切小块后,再比较
 

#导入pil库 
import  Image 

#规格化图片方法 
def make_regalur_image(img, size = (256, 256)): 
    return img.resize(size).convert('RGB') 

#相似度计算方法 
def hist_similar(lh, rh): 
    assert len(lh) == len(rh) 
    return sum(1 - (0 if l == r else float(abs(l - r))/max(l, r)) for l, r in zip(lh, rh))/len(lh) 

#加载2张图片    
img1=Image.open("E:\\code\\python\\o_1.JPG") 
img2=Image.open("E:\\code\\python\\o_2.JPG") 

#规格化图片 
img1=make_regalur_image(img1) 
img2=make_regalur_image(img2) 

#计算相似度 
ret=hist_similar(img1.histogram(), img2.histogram()) 
print "similar=",ret 



//=======================java============================= 
使用BufferedImage 是用跟python计算相似度的算法(或者用opencv的巴氏距离,相关系数), 
或者指定区域,指定采样点数 

BufferedImage image1 = ImageIO.read(new File("E:\\code\\python\\o_1.JPG")); 
BufferedImage image2 = ImageIO.read(new File("
E:\\code\\python\\o_2.JPG"));
 

int[] img1RGB=image1.getRGB(0, 0, image1.getWidth(), image1.getHeight(), null, 0, image1.getWidth()); 
int[] img2RGB=image2.getRGB(0, 0, image2.getWidth(), image2.getHeight(), null, 0, image2.getWidth());
 

//相似度计算公式 
public double similar(int[] img1RGB, int[] img2RGB){ 
   
  int nSize = img1RGB.length < img2RGB.length ? img1RGB.length : img2RGB.length; 
  if(nSize==0) return 0; 
  double nSum=0.0; 
  for(int i=0; i<nSize; i++){ 
   nSum = nSum + (1 - Math.abs((double)(img1RGB
-img2RGB)) / Math.abs(img1RGB < img2RGB ? img1RGB : img2RGB)); 
  } 
  return nSum / nSize; 
}
 

//计算相似度 
double rt = similar(img1RGB, img2RGB); 
System.out.println("rt="+rt);
 

TAG: BufferedImage 相似度 图片比对 java opencv pil pyton 对比 自动化

 

评分:0

我来说两句

Open Toolbar