您的位置:首页 > 运维架构

opencv直方图

2015-06-30 07:50 183 查看
函数直方图是图像各灰度值统计特性与图像灰度值的函数,它统计图像中各个灰度支出项的次数或者是概率,对图像的分析很有帮助。

程序:

#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”,在运行,解决了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: