在您的 nb vs. image 图中,似乎存在一些高频“噪声”(这并不奇怪),并且窗口平均值非常稳定。出于这个答案的目的,我将假设高频噪声相当代表一般情况,但也会有一些慢到中等的趋势。如果图像发生变化,似乎必须有。但是,帧速率通常应该比变化快,因此趋势应该相对缓慢。
通常我会建议使用低频滤波器来消除高频“噪音”,但在这种情况下,我认为这不明智。对于任何给定的图像,下一张图像很可能是高度相关的,所以我认为如果一张图像的 nb 有很大的变化,稍微调整一下是有意义的。我建议两种不同的解决方案。
1) 使用过去n nb 值的简单移动平均值。在这个应用程序中,性能显然很重要,移动平均线的计算成本很低。移动平均线提供了一定的稳定性,考虑到高频噪声,这很重要,而且对数据的变化也有反应。您可以通过减少或增加n来以响应性换取稳定性。
一旦你有了 nb 移动平均线,你就可以使用它来产生“误差”,即你的目标 nb 减去移动平均线 nb。因此,如果平均 nb 过低,则误差为正,如果平均 nb 过高,则误差为负。您使用错误来调整阈值。通常,新的阈值是
threshold=threshold−α∗error
α需要通过分析您的问题或通过经验测试来确定。您从阈值中减去错误结果,因为正错误意味着您需要 nb 上升,这意味着您需要阈值下降。
2) 使用PID 控制器。PID 控制器将为每个图像生成一个阈值,并使用目标 nb 与实际 nb 误差(类似于移动平均误差,除了它是瞬时误差,而不是平均值)来更新下一张图像的阈值。
控制器的“积分”部分将为您提供稳定性,而比例/微分部分将为您提供响应能力。您需要确保循环本身是稳定的,并在不同的视频上测试常量,但这将是调整阈值的一种非常有效的方法。如果需要,它还提供了通过动态更改循环常量来使您的应用程序更智能的可能性。
解决方案 1 更容易实现并且计算成本更低,解决方案 2 更强大但也更复杂。我会看看移动平均线是否足够好。如果是,很好,如果不是,实施 PID 控制器。
编辑:试图使这两种解决方案更加清晰。