用C++进行直方图峰值识别和高斯拟合,最小积累高度差

3
我之前在以下讨论串中问过类似的问题:previous thread。然而,我遗憾地没有完全解决这个问题,只是绕了一个弯路。由于很难将所有新信息包含在之前的讨论串中,我现在发布一个更精炼和扩展的问题,并提供不同的背景信息并链接到旧的讨论串。
我目前正在实现一篇论文中的算法,该算法通过动态识别数据集直方图中的值范围来提取特定区域的三维数据集。简单来说,该方法可以描述如下:
  1. 找到直方图中最高的峰值
  2. 对峰值进行高斯拟合
  3. 使用高斯分布的均值(µ)加减标准差(ϭ)定义的值范围,识别出直方图中的某些区域,并将这些区域的体素(= 3D像素)从原始直方图中移除。
  4. 由于上一步的结果,应该会显示出一个新的最高峰值,基于该峰值可以重复步骤1-3。这些步骤将重复执行,直到数据集直方图为空为止。
我的问题与上述描述中的步骤1和2有关,该步骤在论文中如下描述:“识别最高峰值并拟合高斯曲线。高斯曲线由其中点µ、高度h和偏差ϭ描述。拟合过程最小化直方图与高斯分布中间部分之间的累积高度差异。误差求和范围为µ+/ϭ?"1 接下来,我将提出我的问题并附上我的思考:
  1. 我应该如何确定总直方图中描述最高峰的那些条形箱?为了识别其顶点,我只需遍历直方图并存储具有最高频率的条形箱的索引。但最高箱左右的峰值应该延伸多远呢?目前,我只需向左和向右移动到最高箱,只要下一个箱比前一个箱小即可。然而,这通常是一个非常小的范围,因为直方图中会出现折痕(小峰)。我已经考虑过平滑直方图。但由于体素的减法(上述描述中的步骤3)可能会导致直方图再次包含折痕,因此我必须在每次迭代后进行平滑。我还担心重复平滑会扭曲结果。因此,我想问是否有一种有效的方法来检测峰值的延伸,比我的当前方法更好。在以前的线程中已经有关于混合模型和反卷积的建议。但如果直方图的形状在每次迭代后都不断变化,那么这些方法真的合理吗?
  2. 如何将高斯曲线拟合到识别出的峰值,以使直方图和高斯曲线的中间部分之间的累积高度差最小化?根据以前的线程中的问题一,我通过计算它们的平均值和偏差来将曲线拟合到给定范围的直方图箱。但是,如何从这一点开始最小化直方图和高斯曲线中间部分之间的累积高度差呢?

感谢您的帮助! 问候马克


是否有“高斯分布的中间部分”的精确定义,还是论文上所述的就是全部内容? - Phonon
1
如果您足够精通数学,这可能会有所帮助:http://mathworld.wolfram.com/NonlinearLeastSquaresFitting.html - Phonon
1
通常,将高斯函数拟合到数据的更简单方法是将自然对数的数据拟合为一个抛物线 y,然后将我们拟合的抛物线取指数(exp(y)),这样就可以得到高斯函数。拟合抛物线应该更容易。 - Phonon
1个回答

1

将直方图值添加到左侧和右侧,直到拟合的好坏开始下降。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接