#include <cv.h>
#include <cxcore.h>
IplImage* DrawHistogram(CvHistogram* hist, float scaleX = 1, float scaleY = 1)
{
float histMax = 0;
cvGetMinMaxHistValue(hist, 0, &histMax, 0, 0);
IplImage *imgHist = cvCreateImage(cvSize(256 * scaleX, 64 * scaleY), 8, 1); // 8位单通道图像
cvZero(imgHist);
for (int i = 0; i < 255; i++)
{
float histValue = cvQueryHistValue_1D(hist,i); // 获取bin
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, (1 - nextValue / histMax) * 64 * scaleY); // 上右点
CvPoint pt4 = cvPoint(i*scaleX, (1 - 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("E:\\company\\task\\图片\\4.jpg");
cvNamedWindow("show");
cvShowImage("show", src);
int bins=256; // 宽度为256,每个像素进行画灰度直方图
//CVAPI(CvHistogram*) cvCreateHist(int dims, int* sizes, int type,
// float** ranges CV_DEFAULT(NULL),
// sizes:每一维上直方柱(bin)的数据
// type:直方图存储数据的方式
// CV_HIST_ARRAY:直方图数据表示为多维密集数组 CvMatND
// CV_HIST_TREE:直方图数据表示为多维稀疏数据CvSpaseMat
// ranges:直方图在每一维度上的范围
// uniform:该值为0,表示bin的范围是程序员自己设定的;该值为非零时,表示bin的划分,是均等划分
//每个bin 为1
int dims = 1;
int size = 256 / 1; // 表示一维
int type = CV_HIST_ARRAY;
float range[] = { 0, 255 };
float *r_ranges[] = { range };
CvHistogram *hist;
// 创建直方图
hist = cvCreateHist(1, &size, type, r_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);
// 画Blue通道的灰度直方图
IplImage* histBlue = DrawHistogram(hist);
cvNamedWindow("histBlue");
cvShowImage("histBlue", histBlue);
cvCalcHist(&imgGreen, hist, 0, 0);
IplImage* histGreen = DrawHistogram(hist);
cvNamedWindow("histGreen");
cvCalcHist(&imgRed, hist, 0, 0);
IplImage* histRed = DrawHistogram(hist);
cvNamedWindow("histRed");
cvShowImage("histRed", histRed);
cvClearHist(hist);
cvWaitKey(0);
return 0;
}
#include <cxcore.h>
#include <highgui.h>
// 画单通道的灰度直方图IplImage* DrawHistogram(CvHistogram* hist, float scaleX = 1, float scaleY = 1)
{
float histMax = 0;
cvGetMinMaxHistValue(hist, 0, &histMax, 0, 0);
IplImage *imgHist = cvCreateImage(cvSize(256 * scaleX, 64 * scaleY), 8, 1); // 8位单通道图像
cvZero(imgHist);
for (int i = 0; i < 255; i++)
{
float histValue = cvQueryHistValue_1D(hist,i); // 获取bin
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, (1 - nextValue / histMax) * 64 * scaleY); // 上右点
CvPoint pt4 = cvPoint(i*scaleX, (1 - 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("E:\\company\\task\\图片\\4.jpg");
cvNamedWindow("show");
cvShowImage("show", src);
int bins=256; // 宽度为256,每个像素进行画灰度直方图
//CVAPI(CvHistogram*) cvCreateHist(int dims, int* sizes, int type,
// float** ranges CV_DEFAULT(NULL),
// int uniform CV_DEFAULT(1));
// dims:维度// sizes:每一维上直方柱(bin)的数据
// type:直方图存储数据的方式
// CV_HIST_ARRAY:直方图数据表示为多维密集数组 CvMatND
// CV_HIST_TREE:直方图数据表示为多维稀疏数据CvSpaseMat
// ranges:直方图在每一维度上的范围
// uniform:该值为0,表示bin的范围是程序员自己设定的;该值为非零时,表示bin的划分,是均等划分
//每个bin 为1
int dims = 1;
int size = 256 / 1; // 表示一维
int type = CV_HIST_ARRAY;
float range[] = { 0, 255 };
float *r_ranges[] = { range };
CvHistogram *hist;
// 创建直方图
hist = cvCreateHist(1, &size, type, r_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);
// 画Blue通道的灰度直方图
IplImage* histBlue = DrawHistogram(hist);
cvNamedWindow("histBlue");
cvShowImage("histBlue", histBlue);
// 画Green通道的灰度直方图
cvCalcHist(&imgGreen, hist, 0, 0);
IplImage* histGreen = DrawHistogram(hist);
cvNamedWindow("histGreen");
cvShowImage("histGreen", histGreen);
// 画Red通道的灰度直方图
cvClearHist(hist);cvCalcHist(&imgRed, hist, 0, 0);
IplImage* histRed = DrawHistogram(hist);
cvNamedWindow("histRed");
cvShowImage("histRed", histRed);
cvClearHist(hist);
cvWaitKey(0);
return 0;
}