函数直方图是图像各灰度值统计特性与图像灰度值的函数,它统计图像中各个灰度支出项的次数或者是概率,对图像的分析很有帮助。
代码如下:
#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>