OpenCV直方图用法示例

时间:2021-01-31 20:48:11

这个程序根据输入的图像计算出一个色相饱和度直方图,然后利用网格的方式将直方图以网格形式显示。

[cpp] view plain copy
  1. #include<cv.h>  
  2. #include<highgui.h>  
  3. #include<stdio.h>  
  4.   
  5. #pragma comment(lib, "cv.lib")  
  6. #pragma comment(lib, "cxcore.lib")  
  7. #pragma comment(lib, "highgui.lib")  
  8.   
  9. int main()  
  10. {  
  11.     IplImage* src = NULL;  
  12.     src = cvLoadImage ("test.png", 1);  
  13.       
  14.     IplImage* hsv = cvCreateImage (cvGetSize(src), 8, 3);  
  15.     cvCvtColor (src, hsv, CV_BGR2HSV);  
  16.       
  17.     IplImage* h_plane = cvCreateImage (cvGetSize(src), 8, 1);  
  18.     IplImage* s_plane = cvCreateImage (cvGetSize(src), 8, 1);  
  19.     IplImage* v_plane = cvCreateImage (cvGetSize(src), 8, 1);  
  20.     IplImage* planes[] = {h_plane, s_plane};  
  21.     cvCvtPixToPlane (hsv, h_plane, s_plane, v_plane, 0);   
  22.   
  23.     /*创建和计算直方图*/  
  24.   
  25.     int h_bins = 30;  
  26.     int s_bins = 32;  
  27.     CvHistogram* hist = NULL;  
  28.     int hist_size[] = {h_bins, s_bins};  
  29.     float h_ranges[] = {0, 180};  
  30.     float s_ranges[] = {0, 255};  
  31.     float* ranges[] = {h_ranges, s_ranges};  
  32.     hist = cvCreateHist (2, hist_size, CV_HIST_ARRAY, ranges, 1);  
  33.     cvCalcHist (planes, hist, 0, 0); //计算直方图  
  34.     cvNormalizeHist (hist, 1.0);   //归一化  
  35.   
  36.     /*测试匹配度并输出*/  
  37.       
  38.     /*double like = cvCompareHist (hist, hist, CV_COMP_INTERSECT); 
  39.     printf("%lf\n", like);*/  
  40.   
  41.     /*创建一个图像来可视化我们的直方图*/  
  42.   
  43.     int scale = 10;  
  44.     IplImage* hist_img = cvCreateImage (cvSize(h_bins * scale, s_bins * scale), 8, 3);  
  45.     cvZero (hist_img);  
  46.   
  47.     /*用小的灰度方格填充hist_img*/  
  48.   
  49.     float max_value = 0;  
  50.     cvGetMinMaxHistValue (hist, 0, &max_value, 0, 0);  
  51.     for (int h = 0; h < h_bins; h++)  
  52.     {  
  53.         for (int s = 0; s < s_bins; s++)  
  54.         {  
  55.             float bin_val = cvQueryHistValue_2D (hist, h, s);  
  56.             int intensity = cvRound (bin_val * 255 / max_value);  
  57.             cvRectangle (hist_img, cvPoint(h*scale, s*scale), cvPoint((h+1)*scale-1, (s+1)*scale-1),   
  58.                 CV_RGB(intensity, intensity, intensity),CV_FILLED);  
  59.         }  
  60.     }  
  61.     cvNamedWindow ("src", 1);  
  62.     cvShowImage ("src", src);  
  63.     cvNamedWindow ("H-S histogram", 1);  
  64.     cvShowImage ("H-S histogram", hist_img);  
  65.   
  66.     cvWaitKey (0);  
  67.   
  68.     cvReleaseImage (&src);  
  69.     cvReleaseImage (&hsv);  
  70.     cvReleaseImage (&hist_img);  
  71.     cvReleaseHist (&hist);  
  72.   
  73.     return 0;  
  74. }