#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;
}
效果圖如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX4lFVOdXVE9kMJpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DO2UDMxYDM3EDMygDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)