openCV构造直方图

来源:互联网 发布:mysql root password 编辑:程序博客网 时间:2024/05/17 07:02

学习openCV上的一个例子,根据输入的图像构造色相饱和度的直方图

#include <cv.h>#include <highgui.h>void main(){//以原始通道数读取图片1IplImage* img1 = cvLoadImage("D://vc6.0//MSDev98//MyProjects//MachineVision//TestPic//PeppersRGB.bmp",CV_LOAD_IMAGE_UNCHANGED);//创建图片1的一个空副本IplImage* img2 = cvCreateImage(cvGetSize(img1), 8, 3);//从RGB色彩空间转换到HSV色彩空间cvCvtColor(img1, img2, CV_BGR2HSV);IplImage* h_plane = cvCreateImage(cvGetSize(img1), 8, 1);IplImage* s_plane = cvCreateImage(cvGetSize(img1), 8, 1);IplImage* v_plane = cvCreateImage(cvGetSize(img1), 8, 1);IplImage* planes[] = {h_plane, s_plane};//将HSV图像分成H,S,V三个通道分别操作cvCvtPixToPlane(img2, h_plane, s_plane, v_plane, 0);//建立直方图//确定直方图中方块的数量int h_bins = 30;int s_bins = 32;CvHistogram* hist;inthist_size[] = {h_bins, s_bins};//设定h和s直方图横坐标的范围floath_ranges[] = {0, 180};floats_ranges[] = {0, 255};float*  ranges[] = {h_ranges, s_ranges};//创建一个二维直方图,1代表均匀分割hist = cvCreateHist(2, hist_size, CV_HIST_ARRAY, ranges, 1);//计算直方图cvCalcHist(planes, hist, 0, 0);//归一化cvNormalizeHist(hist, 1.0);int scale = 10;IplImage* histogram = cvCreateImage(cvSize(h_bins * scale, s_bins * scale), 8, 3);cvZero(histogram);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(histogram, cvPoint(h*scale, s*scale), cvPoint((h+1)*scale - 1, (s+1)*scale - 1),CV_RGB(intensity,intensity,intensity),CV_FILLED);}}//命名窗口cvNamedWindow("Source", CV_WINDOW_AUTOSIZE);cvShowImage("Source", img1);cvNamedWindow("Histogram", CV_WINDOW_AUTOSIZE);cvShowImage("Histogram", histogram);cvWaitKey(0);cvDestroyAllWindows();cvReleaseImage(&img1);cvReleaseImage(&histogram);}



0 0
原创粉丝点击