We usually use hue color in hsv to get color distribution, because hue is a little bit free from lighting than RGB model.
The source code is example of drawing rgb graph from hue histogram.
I try to drawing color graph from 2 channel histogram, for example hue, saturation, but I failed, I don't know that is impossible or not.
But 1 channel is possible, refer to this source code and fiagure.
If you want to know how to get histogram, refer to this page.
http://feelmare.blogspot.kr/2014/05/open-cv-get-histogram-and-compare-color.html
Thank you.
-----
#include < stdio.h>
#include < iostream>
#include < opencv2\opencv.hpp>
#ifdef _DEBUG
#pragma comment(lib, "opencv_core247d.lib")
#pragma comment(lib, "opencv_imgproc247d.lib") //MAT processing
#pragma comment(lib, "opencv_highgui247d.lib")
#else
#pragma comment(lib, "opencv_core247.lib")
#pragma comment(lib, "opencv_imgproc247.lib")
#pragma comment(lib, "opencv_highgui247.lib")
#endif
using namespace cv;
using namespace std;
//get representative 3 color
int main()
{
//read 2 images for histogram comparing
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
Mat imgA;
Mat imgA_mask;
imgA = imread(".\\image1.jpg");
imgA_mask = imread(".\\image1_mask.jpg", 0);
imshow("img1", imgA);
imshow("img1_mask", imgA_mask);
//variables preparing
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
int hbins = 30;
int channels[] = {0};
int histSize[] = {hbins};
float hranges[] = { 0, 180 };
const float* ranges[] = { hranges};
Mat patch_HSV;
MatND HistA, HistB;
//cal histogram & normalization
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
cvtColor(imgA, patch_HSV, CV_BGR2HSV);
calcHist( &patch_HSV, 1, channels, imgA_mask, //MaskForHisto, // // do use mask
HistA, 1, histSize, ranges,
true, // the histogram is uniform
false );
normalize(HistA, HistA, 0, 255, CV_MINMAX);
//Mat for drawing
Mat histimg = Mat::zeros(200, 320, CV_8UC3);
histimg = Scalar::all(0);
int binW = histimg.cols / hbins;
Mat buf(1, hbins, CV_8UC3);
//Set RGB color
for( int i = 0; i < hbins; i++ )
buf.at< Vec3b>(i) = Vec3b(saturate_cast< uchar>(i*180./hbins), 255, 255);
cvtColor(buf, buf, CV_HSV2BGR);
//drawing routine
for( int i = 0; i < hbins; i++ )
{
int val = saturate_cast< int>(HistA.at< float>(i)*histimg.rows/255);
rectangle( histimg, Point(i*binW,histimg.rows),
Point((i+1)*binW,histimg.rows - val),
Scalar(buf.at< Vec3b>(i)), -1, 8 );
int r,g,b;
b = buf.at< Vec3b>(i)[0];
g = buf.at< Vec3b>(i)[1];
r = buf.at< Vec3b>(i)[2];
//show bin and RGB value
printf("[%d] r=%d, g=%d, b=%d , bins = %d \n",i , r, g, b, val);
}
imshow( "Histogram", histimg );
waitKey(0);
return 0;
}
----


