【问题标题】:Remove unnecessary histogram peaks from a histogram.从直方图中删除不必要的直方图峰值。
【发布时间】:2014-01-29 16:15:23
【问题描述】:

我正在处理一个对象跟踪问题。我有两个对象的直方图 一个连续的帧。假设这些直方图是在时间实例t-1t 上计算的。下面是这两个直方图的示例。

从第一个直方图(在时刻t-1 计算)可以看出,直方图的所有峰值/分布都集中在强度值 100 附近。这基本上代表了一个对象。然而,在时间瞬间t,出现了一些不必要的峰值(在强度值 75 附近)。

我想从第二个直方图中删除这些峰值,因此,我想问一下是否存在一些可靠的方法来完成这项工作。这些不必要的峰值几乎存在于每一帧中,因此,使用一些简单的阈值对我没有帮助。

我目前在做什么(阈值法):我使用以下公式计算t-1 的直方图和t 的阈值当前直方图的中值和标准差:

low_thresh = med(t-1) - alpha*std(t-1)

high_thresh = med(t-1) + alpha*std(t-1)

hist_without_unnecessary_peaks = low_thresh < current_hist(t) < high_thresh

这个alpha是一个可以调整的参数。这样,我在所有帧中传播这个阈值。但是,我没有得到可靠的结果。如果有人可以帮助我,我会很高兴。谢谢。

【问题讨论】:

    标签: matlab image-processing computer-vision histogram


    【解决方案1】:

    你可以使用更多的连续帧吗?如果是这样,并且您希望保持的峰值足够一致(看起来就是这样),那么您可以在多个帧中获取中间值。

    因此,不要计算整个直方图的中值,而是使用前一帧和下一帧(或更多帧以提高准确性)对每个单独的强度值进行计算。然后使用中值作为直方图中的新强度值。这将删除异常值(即您在第二帧中看到的噪音)。

    【讨论】:

    • 感谢您的建议,这可能有效。但是,不幸的是,我不能有更多的连续帧。因为它是一个对象跟踪问题。而且,这些峰值也不会稳定。在我看来,阈值(我目前正在做的事情)是我留下的唯一选择。
    • 我想你可以退后一帧,仍然可以获得看似实时的结果(取决于帧速率)。然后,如果您在当前帧之后工作一帧,则可以访问三帧并允许中值滤波器发挥其魔力。
    • 再次感谢,是的,它也可以工作。我向您解释我的确切问题:我有两个立体声视频(左和右)和一个深度视频(从它们那里获得)。问题是跟踪任一视频中的对象(或称它们为帧),我想通过使用附加信息(即深度帧)来改进跟踪器的结果。因此,这些直方图实际上是根据对象的深度值计算得出的。因此,属于该对象的所有峰值都将以随机方式移动,具体取决于对象的运动。因此,在这种情况下使用多个帧可能会有风险。
    • 阈值过程中最大的弊端是标准差值,因为如果直方图中存在不必要的峰值(异常值),则该值会发生很大变化。但是,中位数相当稳定。
    • hmm... 这改变了事情... 我现在可以建议的就是尽可能多地使用算法中的知识,例如对象是否在任何事情上都是一致的(深度?)然后将其用作匹配的模板。你越能远离门槛越好,imo。也许使用更具概率性的方法或类似抓取方法?
    【解决方案2】:

    Sanchit,我在处理 RGBD 相机时也必须解决这个问题。

    解决办法:

    (A) 在直方图上应用以下对比函数: 其中 C(i,n) 是索引 i(旧直方图的)处的新直方图,n 是您选择(和调整)的参数 - 请注意,这会产生一个新直方图,n 只是一个参数

    (B) 找到直方图上的所有局部最大值/最小值点并选择最大值。 网上有很多寻找 Matlab 代码的最大值/最小值,所以你不会有问题。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      您可以尝试对数据进行聚类并仅保留成员最多的聚类。这可以通过在直方图中找到峰值(这可能很棘手,具体取决于您有多少噪声)并将其用作kmeans 中的 k 值来完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-25
        • 2023-03-30
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        相关资源
        最近更新 更多