opencv直方图

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


程序:


#include "stdafx.h"


#include<afx.h>  


#include<cv.h>  
#include<highgui.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;  

}


编译出现问题:

1>e:\vs2005\vc\atlmfc\include\afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]

1>生成日志保存在“file://e:\MyObject\test\test\test\Debug\BuildLog.htm”

1>test - 1 个错误,0 个警告

========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

解决方法:右击项目-->属性-->配置属性-->常规,然后在右边的“项目默认值”中的“MFC的使用”选项中选择“在共享 DLL 中使用 MFC”,在运行,解决了






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值