我正在处理对象跟踪问题。我有一个对象的两个直方图
一个连续的帧。假设这些直方图是在时间实例t-1
和t
计算的。以下是这两个直方图的示例。
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
是可以调整的参数。这样,我在所有帧中传播这个阈值。但是,我没有得到强有力的结果。如果有人能帮助我,我会很高兴的。谢谢。
答案 0 :(得分:1)
你可以使用更多的连续帧吗?如果是这样,并且您希望保持的峰值足够一致(看起来像它们那样),那么您可以在多个帧中获取中值。
因此,不是计算整个直方图的中位数,而是针对前一帧和下一帧(或更多帧以获得更高精度)的每个单独强度值进行计算。然后使用中值作为直方图中的新强度值。这将删除异常值(即您在第二帧中看到的噪声)。
答案 1 :(得分:1)
Sanchit,当我使用RGBD相机处理时,我不得不解决这个问题。
解决方案:
(A)在直方图上应用以下对比度函数:
其中C(i,n)是索引i
(旧直方图)的新直方图,n
是您选择(并调整)的参数 - 请注意,这会产生新的直方图, n只是一个参数
(B)找到直方图上的所有局部最大/最小点并选择最大点。 有很多最大/最小值在网上找到Matlab代码,所以你不会有问题。
希望它有所帮助。
答案 2 :(得分:0)
您可以尝试群集数据并仅保留具有最多成员的群集。这可以通过在直方图中找到峰值(这可能很棘手,取决于您有多少噪音)并将其用作kmeans中的k值来完成。