[OPENCV learning] 获取图像的灰度和一维RGB彩色直方图

参考的是书上例7-1.

原代码是获取H-S二维直方图,我在这里改成了获取RGB以及灰度图的一维直方图。代码如下:

首先,要获取分别的直方图,必须将原图片按通道分开,因此,创建四个IplImage,depth为8,然后进行图像转换。
IplImage* r_plane = cvCreateImage(cvGetSize(src),8,1);
IplImage* g_plane = cvCreateImage(cvGetSize(src),8,1);
IplImage* b_plane = cvCreateImage(cvGetSize(src),8,1);
IplImage* gray_plane = cvCreateImage(cvGetSize(src),8,1);
cvCvtPixToPlane(src,b_plane,g_plane,r_plane,0);
cvCvtColor(src,gray_plane,CV_BGR2GRAY);        //OpenCV中不管是Windows中Load的还是摄像头取得的都是BGR顺序排列的

然后为这四幅图创建对应的直方图结构。

int hist_size = 100;
int hist_height = 100;
float range[] = {0,255};
float* ranges[]={range};
CvHistogram* r_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
CvHistogram* g_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
CvHistogram* b_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);

接下来计算直方图,创建用于显示直方图的图像,略去了一部分重复代码,以下也是。

cvCalcHist(&gray_plane,gray_hist,0,0);
cvNormalizeHist(gray_hist,1.0);
int scale = 2;
IplImage* hist_image = cvCreateImage(cvSize(hist_size*scale,hist_height*4),8,3);
cvZero(hist_image);

然后开始显示,这里对直方图进行了标准化处理,不然的话无法观察到明显的变化。

float max_value = 0;
cvGetMinMaxHistValue(r_hist, 0,&max_value,0,0);
for(int i=0;i<hist_size;i++)
{
    float bin_val = cvQueryHistValue_1D(r_hist,i);
    int intensity = cvRound(bin_val*hist_height/max_value);
    cvRectangle(hist_image,cvPoint(i*scale,hist_height-1),cvPoint((i+1)*scale - 1, hist_height - intensity),CV_RGB(255,0,0));
}

最后只要显示出来就可以了。出结果图的时候我并不知道自己的结果是不是正确,于是把图片用Photoshop打开,然后看色阶。结果发现红和蓝的直方图是反的,这才发现,自己在拆分通道的时候写的是rgb而不是bgr吐舌笑脸。改过来之后就对了。

image

本文原创,转载请注明出处

http://www.cnblogs.com/luluathena/

转载于:https://www.cnblogs.com/luluathena/archive/2010/10/20/1856586.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值