#include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#define cvQueryHistValue_1D( hist, idx0 ) \
((float)cvGetReal1D((hist)->bins, (idx0)))
IplImage*DrawHistogram(CvHistogram*hist, float scaleX = 3, float scaleY = 3)
{
float histMax = 0;
cvGetMinMaxHistValue(hist, 0, &histMax, 0);
IplImage*imgHist = cvCreateImage(CvSize(256 * scaleX, 64 * scaleY), 8, 1);
cvZero(imgHist);
for (int i = 0; i < 255; i++)
{
float histValue = cvQueryHistValue_1D(hist, i); //当前像素值个数
float nextValue = cvQueryHistValue_1D(hist, i + 1); //下一个像素值个数
//四个点围成的多边形
CvPoint pt1 = cvPoint( i * scaleX, 64 * scaleY);
CvPoint pt2 = cvPoint((i + 1) * scaleX, 64 * scaleY);
CvPoint pt3 = cvPoint((i + 1) * scaleX, (64 - (nextValue/histMax)*64)*scaleY);
CvPoint pt4 = cvPoint( i * scaleX, (64 - (histValue/histMax)*64)*scaleY);
int numPts = 5;
CvPoint pts[5];
pts[0] = pt1;
pts[1] = pt2;
pts[2] = pt3;
pts[3] = pt4;
pts[4] = pt1;
cvFillConvexPoly(imgHist, pts, numPts, cvScalar(255));//多边形内部填充
}
return imgHist;
}
int main()
{
IplImage*src = cvLoadImage("D:\\1.jpg"); //读图
cvNamedWindow("sr");
cvShowImage("sr", src);
cvWaitKey(0);
int dims = 1;
int size = 256;
float range[] = { 0, 255 };
float *ranges[] = { range };
CvHistogram *hist;
hist = cvCreateHist(dims, &size, CV_HIST_ARRAY, ranges, 1); //创建直方图
cvClearHist(hist);
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); //获取三通道值
cvCalcHist(&imgBlue, hist, 0, 0); //B通道分量
IplImage*histBlue = DrawHistogram(hist);
cvClearHist(hist);
cvCalcHist(&imgGreen, hist, 0, 0);
IplImage*histGreen = DrawHistogram(hist);
cvClearHist(hist);
cvCalcHist(&imgRed, hist, 0, 0);
IplImage*histRed = DrawHistogram(hist);
cvClearHist(hist);
cvNamedWindow("B");
cvNamedWindow("G");
cvNamedWindow("R");
cvShowImage("B", histBlue);
cvShowImage("G",histGreen);
cvShowImage("R", histRed);
cvWaitKey(0);
return 0;
}
效果图如下: