openCV 直方图比较compareHist函数



本文转自:http://blog.csdn.net/siliang13/article/details/16805421

谢谢博主!

opencv中的compareHist函数是用来计算两个直方图相似度,计算的度量方法有4个,分别为Correlation ( CV_COMP_CORREL )相关性,Chi-Square ( CV_COMP_CHISQR ) 卡方,Intersection ( method=CV_COMP_INTERSECT )交集法,Bhattacharyya distance ( CV_COMP_BHATTACHARYYA )常态分布比对的Bhattacharyya距离法。

compareHist函数返回一个数值,相关性方法范围为0到1,1为最好匹配,卡方法和Bhattacharyya距离法是值为0最好,而交集法为值越大越好。

代码如下:

[cpp] view plain copy print ?
  1. #include "opencv2/highgui/highgui.hpp"  
  2. #include "opencv2/imgproc/imgproc.hpp"  
  3. #include <iostream>  
  4. #include <stdio.h>  
  5. using namespace std;  
  6. using namespace cv;  
  7. /** @function main */  
  8. int main( int argc, char** argv )  
  9. {  
  10. Mat src_base, hsv_base;  
  11. Mat src_test1, hsv_test1;  
  12. Mat src_test2, hsv_test2;  
  13. Mat hsv_half_down;  
  14. /// Load three images with different environment settings  
  15.   
  16. src_base = imread( argv[1], 1 );  
  17. src_test1 = imread( argv[2], 1 );  
  18. src_test2 = imread( argv[3], 1 );  
  19. /// Convert to HSV  
  20. cvtColor( src_base, hsv_base, CV_BGR2HSV );  
  21. cvtColor( src_test1, hsv_test1, CV_BGR2HSV );  
  22. cvtColor( src_test2, hsv_test2, CV_BGR2HSV );  
  23. hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );  
  24. /// Using 30 bins for hue and 32 for saturation  
  25. int h_bins = 50; int s_bins = 60;  
  26. int histSize[] = { h_bins, s_bins };  
  27. // hue varies from 0 to 256, saturation from 0 to 180  
  28. float h_ranges[] = { 0, 256 };  
  29. float s_ranges[] = { 0, 180 };  
  30. const float* ranges[] = { h_ranges, s_ranges };  
  31. // Use the o-th and 1-st channels  
  32. int channels[] = { 0, 1 };  
  33. /// Histograms  
  34. MatND hist_base;  
  35. MatND hist_half_down;  
  36. MatND hist_test1;  
  37. MatND hist_test2;  
  38. /// Calculate the histograms for the HSV images  
  39. calcHist( &hsv_base, 1, channels, Mat(), hist_base, 2, histSize, ranges, truefalse );  
  40. normalize( hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat() );  
  41. calcHist( &hsv_half_down, 1, channels, Mat(), hist_half_down, 2, histSize, ranges, truefalse );  
  42. normalize( hist_half_down, hist_half_down, 0, 1, NORM_MINMAX, -1, Mat() );  
  43. calcHist( &hsv_test1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, truefalse );  
  44. normalize( hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat() );  
  45. calcHist( &hsv_test2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, truefalse );  
  46. normalize( hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat() );  
  47. /// Apply the histogram comparison methods  
  48. forint i = 0; i < 4; i++ )  
  49. int compare_method = i;  
  50. double base_base = compareHist( hist_base, hist_base, compare_method );  
  51. double base_half = compareHist( hist_base, hist_half_down, compare_method );  
  52. double base_test1 = compareHist( hist_base, hist_test1, compare_method );  
  53. double base_test2 = compareHist( hist_base, hist_test2, compare_method );  
  54. printf( " Method [%d] Perfect, Base-Half, Base-Test(1), Base-Test(2) : %f, %f, %f, %f \n", i, base_base, base_half ,base_test1,base_test2);  
  55. }  
  56. printf( "Done \n" );  
  57. return 0;  
  58. }  

你可能感兴趣的:(openCV 直方图比较compareHist函数)