【问题标题】:Selecting best range of values from histogram curve从直方图曲线中选择最佳值范围
【发布时间】:2023-03-16 10:39:01
【问题描述】:

场景:

我正在尝试跟踪两个不同颜色的对象。一开始,提示用户将第一个彩色对象(例如,可能是红色)保持在相机前面的特定位置(在屏幕上用矩形标记)并按任意键,然后我的程序会占用帧的那部分(ROI) 并分析其中的颜色,以找到要跟踪的颜色。同样对于第二个对象也是如此。然后像往常一样,在 HSV 颜色平面中使用cv.inRange 函数并跟踪对象。

做了什么:

我获取了要跟踪的对象的 ROI,将其转换为 HSV 并检查了色调直方图。我有两种情况如下:

(这里只有一个主要的中心峰。但在某些情况下,我会得到两个这样的峰,一个是较大的峰,周围有一些像素簇,第二个峰小于第一个峰,但具有小簇的显着尺寸也在它周围。我现在没有它的示例图像。但它几乎看起来像下面(在油漆中创建))

问题:

How can I get best range of hue values from these histograms?

我的意思是最佳范围,可能是 ROI 中大约 80-90% 的像素位于该范围内。

或者有没有比这更好的方法来跟踪不同颜色的对象?

【问题讨论】:

  • 在计算直方图之前,您是否尝试过标准化颜色(例如使用equalizeHist)?
  • 不,我没有。它有什么好处?
  • 它会提高图像的对比度,并且(也许)不会有这样两个峰值 - 只有一个。
  • 您是否考虑过使用贝叶斯分类器等统计模型?如果您有两类对象,它将告诉您未知的第三个对象属于每一类的相对可能性。然后,您可以通过使其多变量来改进它(例如,不仅使用色调,还使用值)您还可以添加类来描述背景......
  • @AbidRahmanK 贝叶斯分类器非常简单:根据您的像素分布,您可以简单地计算均值和标准差。使用这两个,您可以拟合正态分布。然后,可以计算任何像素值成为分布一部分的可能性。你可以自己实现它,但是opencv有一个实现。这很有趣,因为您可以捕捉到变化(您不仅在手段上工作)。当然,如果你有多模态直方图,你可以拟合混合高斯而不是高斯......

标签: python image-processing opencv computer-vision histogram


【解决方案1】:

如果我没听错的话,这里你唯一需要做的就是在图中找到一个最大值,其中最大值不一定是最高峰,而是密度最大的区域。

这是一种非常简单但不太科学但速度很快的 O(n) 方法。通过低通滤波器运行直方图。例如。移动平均线。平均长度可以假设为 20。在这种情况下,新修改直方图的第 10 个值将是:

mh10 = (h1 + h2 + ... + h20) / 20

其中 h1、h2... 是直方图中的值。下一个值:

mh11 = (h2 + h3 + ... + h21) / 20

使用之前计算的 mh10 可以更容易地计算出来,方法是删除它的第一个组件并在末尾添加一个新组件:

mh11 = mh10 - h1/20 + h21/20

您唯一的问题是如何处理直方图边缘的数字。您可以将移动平均线的长度缩小到可用长度,或者您可以在已有的之前和之后添加值。但无论哪种方式,您都无法在边缘处理峰值。

最后,当你有这个修改过的直方图时,就得到最大值。这行得通,因为现在直方图中的每个值不仅包含他自己,还包含邻居。

一种更复杂的方法是加权平均值,例如使用高斯曲线。但这不再是线性的。这将是 O(k*n),其中 k 是平均值的长度,也是高斯的长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多