【问题标题】:how to calculate histogram using every nth pixel opencv如何使用每第n个像素opencv计算直方图
【发布时间】:2015-04-22 05:27:45
【问题描述】:

我正在使用这个 opencv 函数来计算直方图(蓝色)。

calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate );

这里我们使用图像中的所有像素来计算直方图。假设我需要使用每 10 个像素或第 100 个像素计算直方图。有没有一种有效的方法来做到这一点?我需要这样做,因为我认为即使丢失了一些细节,它也可能会提高直方图计算的性能。

感谢任何帮助。

【问题讨论】:

  • 为什么不创建另一个只包含您想要的像素的图像呢?并在该图像上运行 calchist?
  • @Gilad - 我认为这会影响我的算法的性能。如果我错了,请纠正我。
  • 我同意@Gilad,这可能是最好的解决方案。虽然我不明白使用更少的样本会如何提高“直方图的性能”。
  • @a-Jays 我不能谈论这个特定的数据集,但是将像素数减少一个数量级肯定会减少计算直方图所需的时间(记住你需要对每个像素进行分类)。但是,删除或选择要使用的像素的行为可能会花费与使用它们一样多的计算时间。
  • @denver - 同意你的看法。

标签: c++ opencv image-processing histogram


【解决方案1】:

计算时间与像素数成线性关系。您基本上将每个像素取出一次并将其放入垃圾箱中。提前对它们进行任何转换都会导致节省的时间无效。

因此,调整大小或创建新图像之类的操作将无法达到目的。

实现任何节省的最佳方法是使用您自己的直方图计算函数,该函数在迭代像素时简单地将索引增加(10、100 或 1000)。直方图算法很容易重写。这是本科生典型的家庭作业问题。

我认为,在少数情况下,通过使用较少像素绘制直方图来节省时间是值得的。您必须处理非常紧迫的时间限制或非常大的数据。

【讨论】:

  • 感谢您的回答。是的,我正在开展一个项目,该项目正在分析足球视频中的现有事件。在这种情况下,我正在为视频中的每一帧(64 个 bin)生成直方图。这意味着非常大量的数据。所以我会按照你的指示尝试重写直方图计算算法。
【解决方案2】:

使用cv::resize() 和最近邻“插值”沿两个轴每隔 10 个像素对图像进行二次采样。然后计算子采样图像上的直方图。

除了使用额外的 1% 内存(超出您的图像)之外,它应该与动态计算直方图一样高效。

【讨论】:

  • 感谢您的回答。我会试试的。
  • 我希望做插值会比用所有像素做直方图要贵得多。
  • @denver:最近邻“插值”基本上每 10 行每 10 个像素采样一次,总共是图像像素的 1/100。这里没有真正的插值。它只是通过 0.01 个像素的单次传递。这肯定比全面通过所有像素便宜。
  • @AdiShavit 取决于实施和采样不足的程度。虽然您没有计算输出像素值,但您仍在计算要采用哪个像素(通常包括舍入和强制转换操作)。您仍然有内存分配和像素值的复制。
猜你喜欢
  • 2021-08-12
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2013-03-20
相关资源
最近更新 更多