OpenCv 直方图

函数直方图是图像各灰度值统计特性与图像灰度值的函数,它统计图像中各个灰度支出项的次数或者是概率,对图像的分析很有帮助。

代码如下:

#include<stdio.h>
#include<cv.h>
#include<highgui.h>
//#include<windows.h>
#include<afx.h>
//#include<afxwin.h>
int main()
{
 int hist_size=255;
 float range_0[]={0,256};
 float *ranges[]={range_0};
 int i,bin_w;
 float max_value=0,min_value=0;
 int min_idx=0, max_idx=0;
 
 double mean=0,variance=0;
 IplImage* img=cvLoadImage("1.jpg",-1);
 IplImage *pImage=NULL;
 IplImage* pImgGray=NULL;
 
 pImage=cvCloneImage(img);
 pImgGray=cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,1);
 cvCvtColor(pImage,pImgGray,CV_BGR2GRAY);
 //创建一个矩形区域
 CvRect rect= cvRect(0,0,500,600);
 cvSetImageROI(pImgGray,rect);
 
 //创建一个图像用来存放直方图
 IplImage *histImage=cvCreateImage(cvSize(320,200),8,1);
 CvHistogram *hist=cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
 //计算直方图并作用到hist变量中
 cvCalcHist(&pImgGray, hist, 0, NULL);
 //得到直方图的最值及标号
 cvGetMinMaxHistValue(hist,&min_value,&max_value,&min_idx,&max_idx);
 
 //缩放其最大值和最小值让其融入图像
 cvScale(hist->bins,hist->bins,((double)histImage->height)/max_value,0);
 //设置所有的直方图的数值为255
 cvSet(histImage,cvScalarAll(255),0);
 //建一个比例因子  沿宽度释放
 bin_w=cvRound((double)histImage->width/hist_size);
 
 //画直方图
 for(i=0;i<hist_size;i++)
 {
  cvRectangle(histImage,cvPoint(i*bin_w,histImage->height),
   cvPoint((i+1)*bin_w,histImage->height-cvRound(cvGetReal1D(hist->bins,i))),cvScalarAll(0),-1,8,0);
  
  float *bins=cvGetHistValue_1D(hist,i);
  //增加均值
  mean+=bins[0];
  //std::cout<<bins[0]<<" "<<bins[1]<<std::endl;
 }
 mean/=hist_size;
 //根据均值计算变化量
 for(i=0;i<hist_size;i++)
 {
  float* bins=cvGetHistValue_1D(hist,i);
  variance+=pow((bins[0]-mean),2);
 }
 
 variance/=hist_size;
 //std::cout<<"histgram Mean:"<<mean<<std::endl;
 
 //创建窗口
 cvNamedWindow("Original",0);
 cvShowImage("Original",pImage);
 cvNamedWindow("Gray",0);
 cvShowImage("Gray",pImgGray);
 cvNamedWindow("Histgram",0);
 cvShowImage("Histgram",histImage);
 CvFont *pfont= new CvFont;
 cvInitFont(pfont,CV_FONT_HERSHEY_SIMPLEX,0.8,0.8,0.2);
 
 CString Result="Histgram Mean: ";
 CString str;
 str.Format("%f",mean);
 Result+=str+"/n";
 cvPutText(histImage,Result,cvPoint(80,80),pfont,CV_RGB(255,0,100));
 delete pfont;
 cvWaitKey(0);
 cvReleaseImage(&histImage);
 cvReleaseImage(&pImgGray);
 
 cvDestroyWindow("Original");
 cvDestroyWindow("Gray");
 cvDestroyWindow("Histgram");
 return 0;
}


 

compiling出现错误,fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>
Error executing cl.exe.

找了很长时间,才发现是头文件的顺序放错了,将#include<afx.h>调到前面,即:

#include<afx.h>
#include<stdio.h>
#include<cv.h>
#include<highgui.h>
//#include<windows.h>
//#include<afx.h>
//#include<afxwin.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值