OpenCV直方图的实施
发布时间:2021-11-22 10:05:15 所属栏目:教程 来源:互联网
导读:主要涉及两个函数: CvHistogram cvCalcHist #includestdio.h #includecv.h #includehighgui.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
主要涉及两个函数: 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 %dn",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:%fn",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; } ![]() (编辑:开发网_开封站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |