[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。改过来之后就对了。
本文原创,转载请注明出处