opencv 一维灰度直方图---实现代码

#include <cv.h>
#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通道的灰度直方图

cvClearHist(hist);
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值