user2799508
user2799508

Reputation: 848

OpenCV: Histogram not displaying correctly

I am trying to plot Histogram of lenna here the 8 bit single ch. gray scale image.

enter image description here

But it is not displaying the output correctly, as can be seen in the following output:

void show_histogram_image(Mat img1)
{ 

   int sbins = 256;
   int histSize[] = {sbins};

   float sranges[] = { 0, 256 };
   const float* ranges[] = { sranges };
   cv::MatND hist;
   int channels[] = {0};

   cv::calcHist( &img1, 1, channels, cv::Mat(), // do not use mask
       hist, 1, histSize, ranges,
       true, // the histogram is uniform
       false );

   double maxVal=0;
   minMaxLoc(hist, 0, &maxVal, 0, 0);

   int xscale = 10;
   int yscale = 10;


   cv::Mat hist_image; 
   hist_image = cv::Mat::zeros(256, sbins*xscale, CV_8UC1);

   for( int s = 0; s < sbins; s++ )
   {
       float binVal = hist.at<float>(s, 0);
       int intensity = cvRound(binVal*255/maxVal);

      rectangle( hist_image, cv::Point(s*xscale, 0),
           cv::Point( (s+1)*xscale - 1, intensity),
           cv::Scalar::all(255),
           CV_FILLED );

           }

        imshow("Image1",hist_image);


 waitKey(0); 

}

Here is my main();

int main()

{

    Mat img1 = imread("lena512.bmp", CV_8UC1);


         if (img1.empty()) //check whether the image is valid or not 
         {
              cout << "Error : Image cannot be read..!!" << endl;
              system("pause"); //wait for a key press
              return -1;
         }



    show_histogram_image(img1); 

}

And here is the output Histogram image:

enter image description here

I tried changing the xscale even then it is not coming correctly.

Update

I made the following changes:

rectangle( hist_image, cv::Point(s*xscale, hist_image.rows), 
          cv::Point( (s+1)*xscale - 1, hist_image.rows - intensity), 
          cv::Scalar::all(255), CV_FILLED );

And now the output is:

enter image description here

It is much better , but I need lines and clearly visible bins. And it looks like some part is hidden on the right side.

Update 2

I changed CV_FILLED to '1' and now I have:

enter image description here

Upvotes: 1

Views: 777

Answers (1)

berak
berak

Reputation: 39796

since the image origin in opencv is (0,0), and thus the y-axis is pointing downwards, you will have to invert the y-values for your histogram-drawing:

rectangle( hist_image, cv::Point(s*xscale, hist_image.rows),
       cv::Point( (s+1)*xscale - 1, hist_image.rows - intensity),
       cv::Scalar::all(255),
       CV_FILLED );

Upvotes: 2

Related Questions