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”,在运行,解决了
程序:
#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”,在运行,解决了
相关文章推荐
- 各项异性扩散(Anisotropic diffusion)
- openCv对形态学的运算处理
- Apache与ngnix的对比
- CentOS 6.5配置nfs服务
- CentOS 6.5配置nfs服务
- linux操作系下RAR的使用
- linux操作系下RAR的使用
- (转)maven自动部署web项目到tomcat8(向下兼容7)
- 单线多拨,傻瓜式openwrt单线多拨叠加速率教程
- 单线多拨,傻瓜式openwrt单线多拨叠加速率教程
- linux会话命令screen详解
- linux会话命令screen详解
- shell中的大括号和小括号
- Hprof使用及在Hadoop中MR任务使用
- shell中的大括号和小括号
- shell学习之路:流程控制(while)
- 网站部署,网站要求需要支持mb_substring
- 成功测试opencv1.0+vc6.0
- CentOS7 安装zookeeper
- shell学习之路:流程控制(for)