OpenCV直方图用法示例

来源:互联网 发布:人工智能技术发展方向 编辑:程序博客网 时间:2024/04/30 18:26

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

#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;}


 

原创粉丝点击