OpenCV:直方图无法正确显示

时间:2014-07-08 11:09:39

标签: c++ opencv

我正在尝试绘制lenna here the 8 bit single ch. gray scale image的直方图。

enter image description here

但它没有正确显示输出,如以下输出中所示:

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); 

}

这是我的主要();

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); 

}

这是输出直方图图像:

enter image description here

我尝试更改xscale,即使它没有正确使用。

更新

我做了以下更改:

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 );

现在的输出是:

enter image description here

它好多了,但我需要线条和清晰可见的垃圾箱。而且看起来某些部分隐藏在右侧。

更新2

我将CV_FILLED更改为'1',现在我已经:

enter image description here

1 个答案:

答案 0 :(得分:2)

因为opencv中的图像原点是(0,0),因此y轴指向下方, 你必须反转直方图绘制的y值:

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 );
相关问题