您的位置:首页 > 运维架构

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

2010-10-20 13:50 477 查看
参考的是书上例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

。改过来之后就对了。





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

http://www.cnblogs.com/luluathena/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: