这个程序根据输入的图像计算出一个色相饱和度直方图,然后利用网格的方式将直方图以网格形式显示。
[cpp] view plain copy- #include<cv.h>
- #include<highgui.h>
- #include<stdio.h>
- #pragma comment(lib, "cv.lib")
- #pragma comment(lib, "cxcore.lib")
- #pragma comment(lib, "highgui.lib")
- int main()
- {
- IplImage* src = NULL;
- src = cvLoadImage ("test.png", 1);
- IplImage* hsv = cvCreateImage (cvGetSize(src), 8, 3);
- cvCvtColor (src, hsv, CV_BGR2HSV);
- IplImage* h_plane = cvCreateImage (cvGetSize(src), 8, 1);
- IplImage* s_plane = cvCreateImage (cvGetSize(src), 8, 1);
- IplImage* v_plane = cvCreateImage (cvGetSize(src), 8, 1);
- IplImage* planes[] = {h_plane, s_plane};
- cvCvtPixToPlane (hsv, h_plane, s_plane, v_plane, 0);
- /*创建和计算直方图*/
- int h_bins = 30;
- int s_bins = 32;
- CvHistogram* hist = NULL;
- int hist_size[] = {h_bins, s_bins};
- float h_ranges[] = {0, 180};
- float s_ranges[] = {0, 255};
- float* ranges[] = {h_ranges, s_ranges};
- hist = cvCreateHist (2, hist_size, CV_HIST_ARRAY, ranges, 1);
- cvCalcHist (planes, hist, 0, 0); //计算直方图
- cvNormalizeHist (hist, 1.0); //归一化
- /*测试匹配度并输出*/
- /*double like = cvCompareHist (hist, hist, CV_COMP_INTERSECT);
- printf("%lf\n", like);*/
- /*创建一个图像来可视化我们的直方图*/
- int scale = 10;
- IplImage* hist_img = cvCreateImage (cvSize(h_bins * scale, s_bins * scale), 8, 3);
- cvZero (hist_img);
- /*用小的灰度方格填充hist_img*/
- float max_value = 0;
- cvGetMinMaxHistValue (hist, 0, &max_value, 0, 0);
- for (int h = 0; h < h_bins; h++)
- {
- for (int s = 0; s < s_bins; s++)
- {
- float bin_val = cvQueryHistValue_2D (hist, h, s);
- int intensity = cvRound (bin_val * 255 / max_value);
- cvRectangle (hist_img, cvPoint(h*scale, s*scale), cvPoint((h+1)*scale-1, (s+1)*scale-1),
- CV_RGB(intensity, intensity, intensity),CV_FILLED);
- }
- }
- cvNamedWindow ("src", 1);
- cvShowImage ("src", src);
- cvNamedWindow ("H-S histogram", 1);
- cvShowImage ("H-S histogram", hist_img);
- cvWaitKey (0);
- cvReleaseImage (&src);
- cvReleaseImage (&hsv);
- cvReleaseImage (&hist_img);
- cvReleaseHist (&hist);
- return 0;
- }