#include <iostream>
#include <cv.h>
#include <highgui.h>
#include <string.h>
int main()
{
int hist_size=255;
float range_0[]={0,256};
float *ranges[]={range_0};
int i,bin_w;
float max_value=0,min_value=0;
int min_idx=0,max_idx=0;
double mean=0,variance=0;
IplImage *pImage=NULL;
IplImage *pImgGray=NULL;
IplImage *img=cvLoadImage("/Users/guofeng/Documents/histogram/test.bmp",1);
pImage=cvCloneImage(img);
cvNamedWindow("original");
cvShowImage("original", pImage);
pImgGray=cvCreateImage(cvGetSize(pImage), IPL_DEPTH_8U, 1);
cvCvtColor(pImage, pImgGray, CV_BGR2GRAY);
CvRect rect=cvRect(0,0,512,512);
cvSetImageROI(pImgGray, rect);
IplImage *histImage=cvCreateImage(cvSize(320,320), 8, 1);
CvHistogram *hist=cvCreateHist(1, &hist_size, CV_HIST_ARRAY,ranges,1);
cvCalcHist(&pImgGray, hist);
cvGetMinMaxHistValue(hist, &min_value, &max_value,&min_idx,&max_idx);
cvScale(hist->bins,hist->bins,((double)histImage->height/max_value),0);
cvSet(histImage,cvScalarAll(255),0);
bin_w=cvRound((double)histImage->width/hist_size);
for(i=0;i<hist_size;i++)
{
cvRectangle(histImage, cvPoint(i*bin_w,histImage->height), cvPoint((i+1)*bin_w, histImage->height-cvRound(cvGetReal1D(hist->bins, i))), cvScalarAll(0),-1,8,0);
float *bins=cvGetHistValue_1D(hist, i);
mean+=bins[0];
}
mean/=hist_size;
for(i=0;i<hist_size;i++)
{
float *bins=cvGetHistValue_1D(hist, i);
variance+=pow((bins[0]-mean),2);
}
variance/=hist_size;
cvNamedWindow("gray");
cvShowImage("gray", pImgGray);
cvNamedWindow("histogram");
cvShowImage("histogram", histImage);
CvFont *pfont=new CvFont;
cvInitFont(pfont, CV_FONT_HERSHEY_SIMPLEX, 1, 1,0,0);
char Result[]="histogram mean:";
//Result+=str+"\n";
cvPutText(histImage, Result, cvPoint(0,80), pfont, CV_RGB(255,255,0));
cvShowImage("histogram", histImage);
cvSaveImage("/Users/guofeng/Documents/histogram/histogram.jpg", histImage);
cvWaitKey(0);
cvReleaseImage(&pImage);
cvReleaseImage(&pImgGray);
cvReleaseImage(&img);
cvDestroyAllWindows();
return 0;
}