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; }----
No comments:
Post a Comment