Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30995123
  • 博文数量: 230
  • 博客积分: 2868
  • 博客等级: 少校
  • 技术积分: 2223
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-08 21:48
个人简介

Live & Learn

文章分类

全部博文(230)

文章存档

2022年(2)

2019年(5)

2018年(15)

2017年(42)

2016年(24)

2015年(13)

2014年(1)

2012年(5)

2011年(58)

2010年(56)

2009年(9)

我的朋友

分类: LINUX

2017-07-14 10:13:40

比较两个图像是否相似,这个应用范围十分广泛,我刚开始总以为这个技术十分高深(当然也是百分高深),要入门得学很多的相关知识,起码得方方面面都有一定的了解了才能来做这方面的研究。

    但是opencv提供了一套API来做这个的比较,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将图片转换成直方图,然后对直方图进行比较,在某些程度,真实地反映了图片的相似度。下面是具体代码:


[cpp] view plain copy
  1. #include "opencv2/highgui/highgui.hpp"  
  2. #include "opencv/cv.hpp"  
  3.   
  4. //画直方图用  
  5. int HistogramBins = 256;  
  6. float HistogramRange1[2]={0,255};  
  7. float *HistogramRange[1]={&HistogramRange1[0]};  
  8.   
  9. /* 
  10.  * imagefile1: 
  11.  * imagefile2: 
  12.  * method: could be CV_COMP_CHISQR, CV_COMP_BHATTACHARYYA, CV_COMP_CORREL, CV_COMP_INTERSECT 
  13.  */  
  14. int CompareHist(const char* imagefile1, const char* imagefile2)  
  15. {  
  16.     IplImage *image1=cvLoadImage(imagefile1, 0);  
  17.     IplImage *image2=cvLoadImage(imagefile2, 0);  
  18.   
  19.     CvHistogram *Histogram1 = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY,HistogramRange);  
  20.     CvHistogram *Histogram2 = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY,HistogramRange);  
  21.   
  22.     cvCalcHist(&image1, Histogram1);  
  23.     cvCalcHist(&image2, Histogram2);  
  24.   
  25.     cvNormalizeHist(Histogram1, 1);  
  26.     cvNormalizeHist(Histogram2, 1);  
  27.   
  28.     // CV_COMP_CHISQR,CV_COMP_BHATTACHARYYA这两种都可以用来做直方图的比较,值越小,说明图形越相似  
  29.     printf("CV_COMP_CHISQR : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_CHISQR));  
  30.     printf("CV_COMP_BHATTACHARYYA : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_BHATTACHARYYA));  
  31.   
  32.   
  33.     // CV_COMP_CORREL, CV_COMP_INTERSECT这两种直方图的比较,值越大,说明图形越相似  
  34.     printf("CV_COMP_CORREL : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_CORREL));  
  35.     printf("CV_COMP_INTERSECT : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_INTERSECT));  
  36.   
  37.     cvReleaseImage(&image1);  
  38.     cvReleaseImage(&image2);  
  39.     cvReleaseHist(&Histogram1);  
  40.     cvReleaseHist(&Histogram2);  
  41.     return 0;  
  42. }  
  43.   
  44. int main(int argc, char* argv[])  
  45. {  
  46.     CompareHist(argv[1], argv[2]);  
  47.     //CompareHist("d:\\camera.jpg", "d:\\camera1.jpg");  
  48.     return 0;  
  49. }  

这里我用2张使用摄像头拍出来的图片进行比较,camera.jpg和camera1.jpg



对于这两张图的运行结果是:

CV_COMP_CHISQR : 0.2902

CV_COMP_BHATTACHARYYA : 0.1707

CV_COMP_CORREL : 0.8017

CV_COMP_INTERSECT : 0.8070

如果使用同一张图片来自己比较运行的结果应该是

CV_COMP_CHISQR : 0.0000

CV_COMP_BHATTACHARYYA : 0.0000

CV_COMP_CORREL : 1.0000

CV_COMP_INTERSECT : 1.0000

阅读(4142) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~