大家在网上可以清楚的了解到有关OpenCV直方图的数据结构,如何创建,以及其他函数的一些方法说明和使用,下面的地址是网上的一些有关直方图的介绍
下面我将分析一下我自己参考网上资料而写的一段关于建立和显示灰度直方图的代码
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->imageData[offset];
G=(unsigned char )g->imageData[offset];
B=(unsigned char )b->imageData[offset];
if (R>G && R>B) {
max = R;
}
else {
if (G>B) {
max = G;
}
else {
max = B;
}
}
gray1->imageData[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;
}
最后的结果如下图所示:
原始图像
灰度图像
图像直方图
初步涉及OpenCV,希望继续努力,不断的进步,能出更多更好的代码和知识跟大家分享。
推荐阅读:
Ubuntu 12.04 安装 OpenCV2.4.2
CentOS下OpenCV无法读取视频文件