在C++中将高斯曲线拟合到某个直方图峰值

4
我有两个关于拟合高斯曲线到直方图峰值的问题。 我的第一个问题非常基础: 如何将高斯曲线拟合到整个直方图?这是否只意味着我需要找出并计算直方图的均值(µ)和偏差(ϭ),并将它们放入高斯曲线的公式中?
以下示例是否正确?: 假设(仅作为示例),我有一张图像的直方图,其中包含5种颜色值。在X轴上有这5种颜色值,在Y轴上有每种值的频率。 即:
值1:1次
值2:4次
值3:7次
值4:3次
值5:2次
现在平均值(µ)将是3(µ = 3)。
而偏差(ϭ)将是0.9(ϭ = 0.9)。 公式:

现在,我将这些值用于密度函数的公式中来计算我的高斯曲线?

这样正确吗?不幸的是,我的数学背景有点不确定。

  1. 我的第二个问题有点棘手: 这一次,我有一个带有多个峰值的直方图,但我只想将高斯曲线拟合到最高峰。 因此,我通过简单的for循环遍历直方图的所有bin,并找到x轴上的一个强度值(其中包含图像的强度), 具有最多的频率(显示在y轴上)。 这将是最高峰。 但是如何找出偏差? 特别是,因为我不知道应该在我的计算中包括哪些强度值。 据我所知,高斯曲线的转折点位于µ+ϭ和µ-ϭ。那能帮助解决问题吗?

很抱歉这个问题有点数学,但我没有找到更好的地方可以问。 我还阅读了一些类似的主题,但不幸的是它们最终没有回答我的问题。

谢谢你的帮助!

敬礼,马克


1
我在这里没有看到任何编程问题。 - anon
3
当然,这是一道编程问题。这种计算通常通过编写计算机程序来解决。这就是它们被称为计算机的原因。也许你只是遇到了一个无法回答的编程问题;-) - Niki
2个回答

4
你的针对单个峰值的简单方法应该可以。[顺便说一下,如果它与图像有关,我认为这是一个编程问题。]
多个峰值更难处理。解决峰值的过程称为去卷积 (http://en.wikipedia.org/wiki/Deconvolution),通常没有唯一的答案。您可能需要决定有多少个峰值,或峰值的最小方差是多少(否则您可能会为每个 bin 创建一个峰值:-))。

1
我认为如果所有高斯曲线具有相同的方差,仅反卷积可能会解决问题。 - Niki
不是的,但它确实使事情变得更容易。您没有说明您的多模性是由什么引起的,但我预计多个峰大致是等变的。 - peter.murray.rust

3

我认为你对单个高斯参数的估计方法是正确的。

如果涉及到多个高斯分布,你可能需要查阅混合模型或更具体的高斯混合模型。以下是一些注意点:

  1. (你可能已经知道)混合中最强的高斯分布不一定是峰值最高的那一个。
  2. 如果你有两个均值不同的高斯分布之和,则直方图中的峰值将不匹配均值。
  3. 仅使用离散直方图中的单个峰值可能不是一个好主意:实际峰值可能位于两个直方图箱之间。[澄清:在这种情况下,两个箱子中的计数可能显著低于居中的峰值。] 此外,对于大多数类型的数据,您的直方图将包含很多噪音。请至少在直方图上使用某种平均滤波器。

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