为了账号安全,请及时绑定邮箱和手机立即绑定

opencv绘制2d直方图

/ 猿问

opencv绘制2d直方图

opencv绘制2d直方图

我想知道如何在opencv c ++中绘制HSV Mat的二维直方图。我当前试图显示它的代码失败了。我已经四处查看如何绘制直方图,我发现的所有直方图都是将它们绘制为独立的1d直方图。

这是我当前的输出,色调分箱数为30,饱和分箱数为32:

这是另一个输出,其中色调分箱数为7,饱和分箱数为5:

我希望它看起来更像是这里的结果

http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html

我也注意到每当我做cout << Hist.size它给我50x50。我理解这只是意味着数组的第一个维度是250的大小?

另外,如何将直方图从最高到最低(或反之亦然)值频率排序?这是我想要解决的另一个问题。

我目前的功能如下。

void Perform_Hist(Mat& MeanShift, Mat& Pyramid_Result, Mat& BackProj){  
  Mat HSV, Hist;
  int histSize[] = {hbins, sbins};
  int channels[] = {0, 1};
  float hranges[] = {0, 180};
  float sranges[] = {0, 256};
  const float* ranges[] = {hranges, sranges};
  cvtColor(MeanShift, HSV, CV_BGR2HSV);
  Mat PyrGray = Pyramid_Result.clone();
  calcHist(&HSV, 1, channels, Mat(), Hist, 2, histSize, ranges, true, false); 
  normalize(Hist, Hist, 0, 255, NORM_MINMAX, -1, Mat());  
  invert(Hist, Hist, 1);  
  calcBackProject(&PyrGray, 1, channels, Hist, BackProj, ranges, 1, true);
  double maxVal = 0; minMaxLoc(Hist, 0, &maxVal, 0, 0);
  int scale = 10;
  Mat histImage = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);
  for(int i = 1; i < hbins * sbins; i++){
     line(histImage,
     Point(hbins*sbins*(i-1), sbins - cvRound(Hist.at<float>(i-1))),
     Point(hbins*sbins*(i-1), sbins - cvRound(Hist.at<float>(i))),
     Scalar(255,0,0), 2, 8, 0);
  }
  imshow (HISTOGRAM, histImage);}


查看完整描述

3 回答

?
暮色呼如

我使用Luv的倒置2d直方图来抑制背景并增强前景(或者至少也尝试过......)。这是一篇简短的论文,但输出图像可能会清楚我想要做的事情。我还需要在opencv中实现或找到一个可以计算Mat内的欧几里德距离的函数。 breckon.eu/toby/publications/papers/sokalski10uavsalient.pdf

查看完整回答
反对 2019-08-28
?
森栏

你不能通过那个函数对数组进行排序(除非你里面还有颜色信息)在这种情况下的排序只是一个排序的方式/顺序如何从2D数组中挑选单元并呈现它们......不,我不是在CV领域活跃(我做了一些商业项目,但我不是该领域的专家)你链接的输出图像不是直方图...直方图没有对源图像的视觉参考你的看起来像过滤/变换图像而不是直方图

查看完整回答
反对 2019-08-28
  • 3 回答
  • 0 关注
  • 225 浏览

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信