自动化测试中的图片相似度
上一篇 /
下一篇 2012-01-10 09:46:52
//=======================opencv============================= 基本介绍: OpenCV的全称是:Open Source Computer Vision Library 。OpenCV于1999年由Intel建立,现在由Willow Garage提供支持。OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和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);
相关阅读:
- Java 随机数比较和分析 (xin_晴, 2012-8-02)
- 深入Java布局管理器 (xin_晴, 2012-8-03)
- Java最优良的Adapter模式:适配器模式 (xin_晴, 2012-8-06)
- Java基础之集合类 (xin_晴, 2012-8-07)
- Java抽象类和接口的优缺点---总结 (xin_晴, 2012-8-08)
- Java方法的重载以及构造函数的理解 (xin_晴, 2012-8-08)
- Java JNI 调用C++ API及中文编码问题 (xin_晴, 2012-8-09)
- 让Swing表格支持远程后台数据翻页 (xin_晴, 2012-8-10)
- thinking in java笔记 14 类型信息 (jiang8640, 2012-8-10)
- Java理论与实践:用动态代理进行修饰 (xin_晴, 2012-8-13)
收藏
举报
TAG:
BufferedImage
相似度
图片比对
java
opencv
pil
pyton
对比
自动化