如何从二维数据生成 OpenCV 一维直方图?
How to generate a OpenCV 1D Histogram from 2D data?
我有一组成对值的数据集,例如 (x,y)。例如:x 的范围从 -40 到 60,y 的范围从 0 到 100。最初它们存储在 std::vector<std::pair<float,float>>
中,但在循环中我将它们转换为 2 通道 cv::Mat
以便能够传递它到 OpenCV 的 cv::calcHist
函数。我想像这样实现一维直方图:here。因为我实际上有两个数据范围,所以我总是从 cv::calcHist
得到一个二维直方图 cv::Mat
,但我基本上想根据给定的 bin_size [=15] 进行计算=] 对于 x 轴,y 轴的平均值。
举个例子:x的范围是-40到60,期望的bins = 10, bin_size = 10, 数据点(x,y): (-35, 10), (-39, 20)
然后,一维直方图需要计算 y = (10+20)/2 的 bin 范围从 -40 到 -30 的平均值。
因此每个 bin 的总和不应该是落在特定 bin 范围内的值的简单计数,而是值的平均值。
我希望我能以一种可以理解的方式陈述问题。任何帮助表示赞赏。
我不认为 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]);
}
}
}
我有一组成对值的数据集,例如 (x,y)。例如:x 的范围从 -40 到 60,y 的范围从 0 到 100。最初它们存储在 std::vector<std::pair<float,float>>
中,但在循环中我将它们转换为 2 通道 cv::Mat
以便能够传递它到 OpenCV 的 cv::calcHist
函数。我想像这样实现一维直方图:here。因为我实际上有两个数据范围,所以我总是从 cv::calcHist
得到一个二维直方图 cv::Mat
,但我基本上想根据给定的 bin_size [=15] 进行计算=] 对于 x 轴,y 轴的平均值。
举个例子:x的范围是-40到60,期望的bins = 10, bin_size = 10, 数据点(x,y): (-35, 10), (-39, 20) 然后,一维直方图需要计算 y = (10+20)/2 的 bin 范围从 -40 到 -30 的平均值。
因此每个 bin 的总和不应该是落在特定 bin 范围内的值的简单计数,而是值的平均值。
我希望我能以一种可以理解的方式陈述问题。任何帮助表示赞赏。
我不认为 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]);
}
}
}