如何从 2D 数据生成 OpenCV 1D 直方图?

Posted

技术标签:

【中文标题】如何从 2D 数据生成 OpenCV 1D 直方图?【英文标题】:How to generate a OpenCV 1D Histogram from 2D data? 【发布时间】:2016-07-23 07:40:28 【问题描述】:

我有一个成对值的数据集,例如 (x,y)。例如:x 范围从 -40 到 60,y 范围从 0 到 100。最初它们存储在 std::vector<std::pair<float,float>> 中,但在循环中我将它们转换为 2 通道 cv::Mat 以便能够将其传递给 OpenCV 的 @987654324 @ 功能。我想像这样实现一维直方图:here。因为我实际上有两个数据范围,所以我总是以cv::Matcv::calcHist 为结果得到一个二维直方图,但我基本上想根据给定的 bin_size x_bin 计算 x 轴的平均值y 中的值。

举个例子:x范围从-40到60,期望的bins = 10,bin_size = 10,数据点(x,y):(-35, 10), (-39, 20) 然后,一维直方图需要计算从 -40 到 -30 的 bin 范围的 y = (10+20)/2 的平均值。

因此,每个 bin 的总和不应是落在该特定 bin 范围内的值的简单计数,而是值的平均值。

我希望我能以一种可以理解的方式陈述这个问题。任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

我不认为 OpenCV 的 cv::calcHist 能够为您提供您想要的东西,尤其是因为您正在尝试基于 X 获取 Y 的统计信息。无论如何,如果没有 OpenCV,这并不难。

void calcHist(const std::vector<std::pair<float, float>>& data, const float min_x, const float max_x, const int num_bins, std::vector<float>& hist)

  hist.resize(num_bins, 0.f);
  std::vector<int> hist_counts(num_bins, 0);
  float bin_size = (max_x-min_x)/num_bins;
  for (const auto& p : data) 
    // Assign bin
    int bin = static_cast<int>((p.first-min_x)/bin_size);
    // Avoid out of range
    bin = std::min(std::max(bin, 0), num_bins-1);
    hist[bin] += p.second;
    hist_counts[bin]++;
  
  // Compute average
  for (int i = 0;i < num_bins; ++i) 
    if (hist_counts[i]) 
      hist[i] /= static_cast<float>(hist_counts[i]);
    
  

【讨论】:

以上是关于如何从 2D 数据生成 OpenCV 1D 直方图?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 中的像素值超过 255 - 1D 直方图

OpenCV:如何有效地将 Mat2d 矩阵的每个元素乘以 Mat1d 矩阵

OpenCV---直方图反向投影

OpenCV之图像直方图反向投影

如何在 1D 缓冲区中生成 2D 纹理并将其加载到 OpenGL 中?

使用 spyder 从 2D 数据帧中提取并根据 2D 数据帧中的值位置向 1D 数据帧添加值