大家在網上可以清楚的了解到有關OpenCV直方圖的數據結構,如何創建,以及其他函數的一些方法說明和使用,下面的地址是網上的一些有關直方圖的介紹 http://www.linuxidc.com/Linux/2013-10/91707.htm
下面我將分析一下我自己參考網上資料而寫的一段關於建立和顯示灰度直方圖的代碼
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,希望繼續努力,不斷的進步,能出更多更好的代碼和知識跟大家分享。