大家在网上可以清楚的了解到有关OpenCV直方图的数据结构,如何创建,以及其他函数的一些方法说明和使用,下面的地址是网上的一些有关直方图的介绍

http://blog.csdn.net/xiaowei_cqu/article/details/7600666

下面我将分析一下我自己参考网上资料而写的一段关于建立和显示灰度直方图的代码

void histImage(IplImage* gray1,IplImage* histImg)

{

int histSize=255; //直方图针数

float range0[]={0,256}; //第0维数值变化范围

float * ranges[]={range0}; //第1维数值变化范围

int i,binW; //下标号

float maxValue,minValue; //直方图数值的max和min

int minIdx=0,maxIdx=0; //对应上述值时的下标号

CvHistogram * hist=cvCreateHist(1,&histSize,CV_HIST_ARRAY,ranges,1);//创建一个直方图

cvCalcHist(&gray1,hist,0,NULL);//计算直方图

cvGetMinMaxHistValue(hist,&minValue,&maxValue,&minIdx,&maxIdx);//得到最大最小值及其标号

//缩放最大值最小值以溶入图像

cvScale(hist->bins,hist->bins,((double)histImg->height)/maxValue,0);

cvSet(histImg,cvScalar(255),0);//把直方图画到图像中

for (i=0;i<histSize;i++)

{

cvRectangle(histImg,cvPoint(i,histImg->height),

cvPoint(i+1,histImg->height-cvRound(cvGetReal1D(hist->bins,i))),cvScalarAll(0),1,8,0);//在histImg //图像中中画出直方图矩形

}

}

//这是一个可以被调用的函数,可以在main函数中调用它,传递两个IplImage类型的参数,gray1为输入的单通 //道的图像,histImg为输出的直方图图像。

int main()

{

int R,G,B,offset,max;

cvNamedWindow("origin");

cvNamedWindow("gray1");

cvNamedWindow("hist");

IplImage* cvLoadImage("图.jpg",-1); //载入彩×××像

IplImage* gray1=cvCreateImage(cvGetSize(src),src->depth,1);

IplImage * histImg=cvCreateImage(cvSize(255,200),IPL_DEPTH_8U,1);//用于存放直方图

IplImage* r=cvCreateImage(cvGetSize(src),src->depth,1);//存放红×××像

IplImage* g=cvCreateImage(cvGetSize(src),src->depth,1);//存放绿×××像

IplImage* b=cvCreateImage(cvGetSize(src),src->depth,1);//存放蓝×××像

cvSplit(src,b,g,r,NULL);//分割彩色的通道

for(int y=0;y<g->height;y++)//取三个通道中的最大值作为灰×××像的值

for(int x=0;x<g->width;x++)

{

offset=y*g->widthStep+x;

R=(unsigned char )r->p_w_picpathData[offset];

G=(unsigned char )g->p_w_picpathData[offset];

B=(unsigned char )b->p_w_picpathData[offset];

if (R>G && R>B) {

max = R;

}

else {

if (G>B) {

max = G;

}

else {

max = B;

}

}

gray1->p_w_picpathData[offset]=max;

}

cvSmooth( gray1, gray1, CV_BLUR , 3, 3 );//去噪

histImage(gray1,histImg);

cvShowImage("hist",histImg);

cvShowImage("origin",src);

cvShowImage("gray1",gray1);

while(1){if((cvWaitKey(10)&0x7f)==27)break;}

cvDestroyAllWindows();

cvReleaseImage(&src);

cvReleaseImage(&histImg);

cvReleaseImage(&gray1);

return 1;

}

最后的结果如下图所示:

160036327.jpg原始图像

160037985.jpg灰度图像

160037113.jpg图像直方图

初步涉及OpenCV,希望继续努力,不断的进步,能出更多更好的代码和知识跟大家分享。