title: Find dominant color on an image
body: <p>I want to find dominant color on an image. For this, I know that I should use image histogram. But I am not sure of image format. Which one of rgb, hsv or gray image, should be used?</p>
  
  <p>After the histogram is calculated, I should find max value on histogram. For this, should I find below maximum binVal value for hsv image? Why my result image contains only black color?</p>
  
  <pre><code>float binVal = hist.at&lt;float&gt;(h, s);
  </code></pre>
  
  <p><strong>EDIT :</strong> </p>
  
  <p>I have tried the below code. I draw h-s histogram. And my result images are here. I don't find anything after binary threshold. Maybe I find max histogram value incorrectly.</p>
  
  <p><img src="https://i.stack.imgur.com/yGpPP.png" alt="enter image description here">
  <img src="https://i.stack.imgur.com/MnO8j.png" alt="enter image description here"></p>
  
  <pre><code>cvtColor(src, hsv, CV_BGR2HSV);
  
  // Quantize the hue to 30 levels
  // and the saturation to 32 levels
  int hbins = 20, sbins = 22;
  int histSize[] = {hbins, sbins};
  // hue varies from 0 to 179, see cvtColor
  float hranges[] = { 0, 180 };
  // saturation varies from 0 (black-gray-white) to
  // 255 (pure spectrum color)
  float sranges[] = { 0, 256 };
  const float* ranges[] = { hranges, sranges };
  MatND hist;
  // we compute the histogram from the 0-th and 1-st channels
  int channels[] = {0, 1};
  
  calcHist( &amp;hsv, 1, channels, Mat(), // do not use mask
           hist, 2, histSize, ranges,
           true, // the histogram is uniform
           false );
  double maxVal=0;
  minMaxLoc(hist, 0, &amp;maxVal, 0, 0);
  
  int scale = 10;
  Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);
  int maxIntensity = -100;
  for( int h = 0; h &lt; hbins; h++ ) {
      for( int s = 0; s &lt; sbins; s++ )
      {
          float binVal = hist.at&lt;float&gt;(h, s);
          int intensity = cvRound(binVal*255/maxVal);
          rectangle( histImg, Point(h*scale, s*scale),
                      Point( (h+1)*scale - 1, (s+1)*scale - 1),
                      Scalar::all(intensity),
                      CV_FILLED );
          if(intensity &gt; maxIntensity)
              maxIntensity = intensity;
      }
  }
  std::cout &lt;&lt; "max Intensity " &lt;&lt; maxVal &lt;&lt; std::endl;
  Mat dst;
  cv::threshold(src, dst, maxIntensity, 255, cv::THRESH_BINARY);
  
  namedWindow( "Dest", 1 );
  imshow( "Dest", dst );
  namedWindow( "Source", 1 );
  imshow( "Source", src );
  
  namedWindow( "H-S Histogram", 1 );
  imshow( "H-S Histogram", histImg );
  </code></pre>