歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenCV直方圖的使用

OpenCV直方圖的使用

日期:2017/3/1 10:05:27   编辑:Linux編程

主要涉及兩個函數:

CvHistogram
cvCalcHist

#include<stdio.h>
#include<cv.h>
#include<highgui.h>
int main()
{
int hist_size[]={16,16,16};
float range[]={0,255};
float *ranges[]={range};
int i,j,bin_w;
float max_value,min_value;
int min_idx, max_idx;
char *name[3]={"b","g","r"};
double mean=0,variance=0;
IplImage* img=cvLoadImage("b.jpg",1);
IplImage *pImage=NULL;
IplImage *pImg[3];
pImg[0]=cvCreateImage(cvGetSize(img),8,1);
pImg[1]=cvCreateImage(cvGetSize(img),8,1);
pImg[2]=cvCreateImage(cvGetSize(img),8,1);
cvSplit(img,pImg[0],pImg[1],pImg[2],NULL);
pImage=cvCloneImage(img);

CvRect rect= cvRect(0,0,500,600);
cvSetImageROI(pImage,rect);

//創建一個圖像用來存放直方圖
IplImage *histImage[3];
CvHistogram *hist[3];
for(j=0;j<3;j++){
histImage[j]=cvCreateImage(cvSize(320,200),8,3);
//cvZero(histImage[j]);
hist[j]=cvCreateHist(1,&hist_size[j],CV_HIST_ARRAY,ranges,1);
//計算直方圖並作用到hist變量中
cvCalcHist(&pImg[j], hist[j], 0, NULL);
//得到直方圖的最值及標號
cvGetMinMaxHistValue(hist[j],&min_value,&max_value,&min_idx,&max_idx);
//縮放其最大值和最小值讓其融入圖像
cvScale(hist[j]->bins,hist[j]->bins,((double)histImage[j]->height)/max_value,0);
//設置所有的直方圖的數值為255
cvSet(histImage[j],cvScalarAll(255),0);
//建一個比例因子 沿寬度釋放
bin_w=cvRound((double)histImage[j]->width/hist_size[j]);
mean=0;
for(i=0;i<hist_size[j];i++)
{
CvScalar scalar=cvScalarAll(0);
scalar.val[j]=(i*255/hist_size[j]);
cvRectangle(histImage[j],cvPoint(i*bin_w,histImage[j]->height),
cvPoint((i+1)*bin_w,histImage[j]->height-cvRound(cvGetReal1D(hist[j]->bins,i))),scalar,-1,8,0);

float *bins=cvGetHistValue_1D(hist[j],i);
//增加均值
mean+=bins[0];
//std::cout<<bins[0]<<" "<<bins[1]<<std::endl;
//printf("%d %d\n",bins[0],bins[1]);
}
cvNamedWindow(name[j],0);
cvShowImage(name[j],histImage[j]);

mean/=hist_size[j];
//根據均值計算變化量
for(i=0;i<hist_size[j];i++)
{
float* bins=cvGetHistValue_1D(hist[j],i);
variance+=pow((bins[0]-mean),2);
}

variance/=hist_size[j];
printf("histgram Mean:%f\n",mean);

}

//創建窗口
cvNamedWindow("Original",0);
cvShowImage("Original",pImage);
cvWaitKey(0);
cvReleaseImage(&img);
for(j=0;j<3;j++){
cvDestroyWindow(name[j]);
cvReleaseImage(&pImg[j]);
cvReleaseImage(&histImage[j]);
cvReleaseHist(&hist[j]);
}
cvDestroyWindow("Original");
return 0;
}

Copyright © Linux教程網 All Rights Reserved