//通过网上的灰度直方图视频介绍,但是自己按照视频的操作没有实现灰度直方图的创建,通过借鉴大流士一士的文章,创建子函数,用cvFillConvexPoly函数代替 cvRectangle使灰度直方图更加平滑,小弟很多都还没有弄清楚,后期会继续按条介绍
// 11-3.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#define cvQueryHistValue_1D( hist, idx0 ) ((float)cvGetReal1D( (hist)->bins, (idx0)))
IplImage* DrawHistogram(CvHistogram* hist)
{
int scale = 2;
//创建一张一维直方图的“图”,横坐标为灰度级,纵坐标为像//素个数
IplImage* hist_image = cvCreateImage(cvSize(256*scale,256),8,1);
cvZero(hist_image);
//统计直方图中的最大直方块
float max_value = 0;
cvGetMinMaxHistValue(hist, 0,&max_value,0,0);
//分别将每个直方块的值绘制到图中
for(int i=0;i<255;i++)
{
float bin_val = cvQueryHistValue_1D(hist,i);
float bin_val_2 = cvQueryHistValue_1D(hist,i+1);
//像素i的概率
//为什么称为概率呢?因为我们知道归一化直方图之后,所有的直方块之和=1,
//所以我们利用cvQueryHistValue_1D得到的直方块的值其实就是概率了。
int intensity = cvRound(bin_val*256/max_value); //要绘制的高度
int intensity_2 = cvRound(bin_val_2*256/max_value); //要绘制的高度
CvPoint Points[5] = { {i*scale,256-1}, {(i+1)*scale,256-1}, {(i+1)*scale,intensity_2},
{i*scale,intensity}, {i*scale,256-1} };
cvFillConvexPoly(hist_image,Points,5,CV_RGB(255,255,255));
}
return hist_image;
}
int _tmain(int argc, _TCHAR* argv[])
{
IplImage* src=cvLoadImage("E:\\OPENCV\\image\\girl.jpg");
IplImage* imgRed=cvCreateImage(cvGetSize(src),8,1);
IplImage* imgGreen=cvCreateImage(cvGetSize(src),8,1);
IplImage* imgBlue=cvCreateImage(cvGetSize(src),8,1);
cvSplit(src,imgBlue,imgGreen,imgRed,NULL);
cvNamedWindow("sr");
cvShowImage("sr",src);
int dims=1;
int size=256;
float range[]={0,255};
float* ranges[]={range};
/*
第一个为直方图的维度
第二个是每一维直方图bin的数据
第三个参数 直方图存储数据的方式 一种为密集型一种为稀疏型
第四个为一个范围,灰度直方图为0-255,
第五个,如果0是自由设定,非0为均等划分
*/
CvHistogram* hist;
hist=cvCreateHist(dims,&size,CV_HIST_ARRAY,ranges,1);
cvCalcHist(&imgBlue,hist,0,0);
cvNormalizeHist(hist,1.0);
//
IplImage* histBlue=DrawHistogram(hist);
cvClearHist(hist);
cvNamedWindow("B");
cvShowImage("B",histBlue);
cvCalcHist(&imgGreen,hist,0,0);
//
IplImage* histGreen=DrawHistogram(hist);
cvClearHist(hist);
cvNamedWindow("G");
cvShowImage("G",histGreen);
cvCalcHist(&imgRed,hist,0,0);
//
IplImage* histRed=DrawHistogram(hist);
cvClearHist(hist);
cvNamedWindow("R");
cvShowImage("R",histRed);
cvWaitKey(0);
return 0;
}