计算机视觉
图像处理

【OpenCV】绘制直方图

和这一篇《数字图像直方图》内容是一样的,只是使用Mat格式实现~

绘制灰色直方图

  1. //绘制灰度直方图
  2. int main(  )
  3. {
  4.     Mat src,gray;
  5.     src=imread(“baboon.jpg”);
  6.     cvtColor(src,gray,CV_RGB2GRAY);
  7.     int bins = 256;
  8.     int hist_size[] = {bins};
  9.     float range[] = { 0, 256 };
  10.     const float* ranges[] = { range};
  11.     MatND hist;
  12.     int channels[] = {0};
  13.     calcHist( &gray, 1, channels, Mat(), // do not use mask
  14.         hist, 1, hist_size, ranges,
  15.         true// the histogram is uniform
  16.         false );
  17.     double max_val;
  18.     minMaxLoc(hist, 0, &max_val, 0, 0);
  19.     int scale = 2;
  20.     int hist_height=256;
  21.     Mat hist_img = Mat::zeros(hist_height,bins*scale, CV_8UC3);
  22.     for(int i=0;i<bins;i++)
  23.     {
  24.         float bin_val = hist.at<float>(i);
  25.         int intensity = cvRound(bin_val*hist_height/max_val);  //要绘制的高度
  26.         rectangle(hist_img,Point(i*scale,hist_height-1),
  27.             Point((i+1)*scale – 1, hist_height – intensity),
  28.             CV_RGB(255,255,255));
  29.     }
  30.     imshow( “Source”, src );
  31.     imshow( “Gray Histogram”, hist_img );
  32.     waitKey(10000000000);
  33.     return 0;
  34. }

实验结果:

绘制RGB三色直方图

  1. //绘制RGB三色分量直方图
  2. int main(  )
  3. {
  4.     Mat src;
  5.     src=imread(“baboon.jpg”);
  6.     int bins = 256;
  7.     int hist_size[] = {bins};
  8.     float range[] = { 0, 256 };
  9.     const float* ranges[] = { range};
  10.     MatND hist_r,hist_g,hist_b;
  11.     int channels_r[] = {0};
  12.     calcHist( &src, 1, channels_r, Mat(), // do not use mask
  13.         hist_r, 1, hist_size, ranges,
  14.         true// the histogram is uniform
  15.         false );
  16.     int channels_g[] = {1};
  17.     calcHist( &src, 1, channels_g, Mat(), // do not use mask
  18.         hist_g, 1, hist_size, ranges,
  19.         true// the histogram is uniform
  20.         false );
  21.     int channels_b[] = {2};
  22.     calcHist( &src, 1, channels_b, Mat(), // do not use mask
  23.         hist_b, 1, hist_size, ranges,
  24.         true// the histogram is uniform
  25.         false );
  26.     double max_val_r,max_val_g,max_val_b;
  27.     minMaxLoc(hist_r, 0, &max_val_r, 0, 0);
  28.     minMaxLoc(hist_g, 0, &max_val_g, 0, 0);
  29.     minMaxLoc(hist_b, 0, &max_val_b, 0, 0);
  30.     int scale = 1;
  31.     int hist_height=256;
  32.     Mat hist_img = Mat::zeros(hist_height,bins*3, CV_8UC3);
  33.     for(int i=0;i<bins;i++)
  34.     {
  35.         float bin_val_r = hist_r.at<float>(i);
  36.         float bin_val_g = hist_g.at<float>(i);
  37.         float bin_val_b = hist_b.at<float>(i);
  38.         int intensity_r = cvRound(bin_val_r*hist_height/max_val_r);  //要绘制的高度
  39.         int intensity_g = cvRound(bin_val_g*hist_height/max_val_g);  //要绘制的高度
  40.         int intensity_b = cvRound(bin_val_b*hist_height/max_val_b);  //要绘制的高度
  41.         rectangle(hist_img,Point(i*scale,hist_height-1),
  42.             Point((i+1)*scale – 1, hist_height – intensity_r),
  43.             CV_RGB(255,0,0));
  44.         rectangle(hist_img,Point((i+bins)*scale,hist_height-1),
  45.             Point((i+bins+1)*scale – 1, hist_height – intensity_g),
  46.             CV_RGB(0,255,0));
  47.         rectangle(hist_img,Point((i+bins*2)*scale,hist_height-1),
  48.             Point((i+bins*2+1)*scale – 1, hist_height – intensity_b),
  49.             CV_RGB(0,0,255));
  50.     }
  51.     imshow( “Source”, src );
  52.     imshow( “RGB Histogram”, hist_img );
  53.     waitKey(10000000000);
  54.     return 0;
  55. }

实验结果:

绘制二维直方图

  1. //绘制H-S二维直方图
  2. int main( )
  3. {
  4.     Mat src,hsv;
  5.     src=imread(“baboon.jpg”);
  6.     cvtColor(src, hsv, CV_BGR2HSV);
  7.     // Quantize the hue to 30 levels
  8.     // and the saturation to 32 levels
  9.     int hbins = 256, sbins = 180;
  10.     int histSize[] = {hbins, sbins};
  11.     // hue varies from 0 to 179, see cvtColor
  12.     float hranges[] = { 0, 180 };
  13.     // saturation varies from 0 (black-gray-white) to
  14.     // 255 (pure spectrum color)
  15.     float sranges[] = { 0, 256 };
  16.     const float* ranges[] = { hranges, sranges };
  17.     MatND hist;
  18.     // we compute the histogram from the 0-th and 1-st channels
  19.     int channels[] = {0, 1};
  20.     calcHist( &hsv, 1, channels, Mat(), // do not use mask
  21.         hist, 2, histSize, ranges,
  22.         true// the histogram is uniform
  23.         false );
  24.     double maxVal=0;
  25.     minMaxLoc(hist, 0, &maxVal, 0, 0);
  26.     int scale = 2;
  27.     Mat histImg = Mat::zeros(sbins*scale, hbins*scale, CV_8UC3);
  28.     forint h = 0; h < hbins; h++ )
  29.         forint s = 0; s < sbins; s++ )
  30.         {
  31.             float binVal = hist.at<float>(h, s);
  32.             int intensity = cvRound(binVal*255/maxVal);
  33.             rectangle( histImg, Point(h*scale, s*scale),
  34.                 Point( (h+1)*scale – 1, (s+1)*scale – 1),
  35.                 Scalar::all(intensity),
  36.                 CV_FILLED );
  37.         }
  38.     namedWindow( “Source”, 1 );
  39.     imshow( “Source”, src );
  40.     namedWindow( “H-S Histogram”, 1 );
  41.     imshow( “H-S Histogram”, histImg );
  42.     waitKey(10000000000);
  43.     return 0;
  44. }

实验结果:

转载注明来源:CV视觉网 » 【OpenCV】绘制直方图

分享到:更多 ()
扫描二维码,给作者 打赏
pay_weixinpay_weixin

请选择你看完该文章的感受:

0不错 1超赞 0无聊 0扯淡 0不解 0路过

评论 6

评论前必须登录!