【问题标题】:Looking for C/C++ library calculating max of Gaussian curve using discrete values寻找使用离散值计算高斯曲线最大值的 C/C++ 库
【发布时间】:2011-10-26 23:01:52
【问题描述】:

我有一些离散值和假设,这些值位于高斯曲线上。 应该有一个只使用 3 个离散值的最大计算算法。 你知道实现这个计算的 C/C++ 中的任何库或代码吗?

谢谢!

附: 最初的任务是实现自动对焦。我移动(显微镜)相机并在不同位置拍摄照片。具有最多不同颜色的位置应该具有最佳焦点。

编辑 这是很久以前的事了:-( 我只是想删除这个问题,但尊重好的答案。

【问题讨论】:

  • 基本上,您需要一个高斯拟合。这可以通过残酷的fitting a parabola on the logarithm of your y来完成;在您的特定情况下,这非常容易,因为通过三个点,您可以确定一条穿过它们的抛物线。
  • 谢谢。不幸的是,该链接是一个 Matlab 实现,但“高斯拟合”是谷歌的一个很好的起点。
  • 我为您的具体案例写了一个广泛的答案,请查看。 :)
  • 这是用于什么样的显微镜?当您说“最不同的颜色”时,您是在谈论直方图的宽度吗?还是您真的在看 RGB 相机图像?
  • @Jonas Heidelberg:显微镜由不同的部件组成(自制)——没有现成的。目前,我确实查看了图片每 100 行的每个像素(实际上只有绿色)。同时,我们发现,这种方法不够稳定,例如因为一些(不良焦点)图片会产生渐变 - 这会导致多种颜色。但是,高斯拟合将有助于任何其他启发式方法。谢谢!

标签: c++ c discrete-mathematics curve-fitting gaussian


【解决方案1】:

你有三个点应该在高斯曲线上;这意味着它们位于函数上:

如果你取这个函数的对数,你会得到:

这只是一个简单的二级多项式,即具有对称垂直轴的抛物线:

所以,如果知道抛物线的三个系数,就可以推导出高斯曲线的参数;顺便说一句,您感兴趣的唯一高斯函数参数是 b,因为它告诉您分布的中心在哪里,即它的最大值在哪里。马上就知道了

剩下要做的就是拟合抛物线(使用“原始”x 和您的值的对数)。现在,如果你有更多的点,就会涉及多项式拟合,但是,由于你只有三个点,情况很简单:只有一条抛物线穿过三个点。

您现在只需为每个点写出抛物线方程并求解系统:

(使用,其中zs 是在相应x 处读取的实际值)

这可以手动解决(需要一些时间),使用一些 CAS 或...looking on StackOverflow :) ;因此解决方案是:

所以使用这些最后的方程(记住:ys 是你的“真实”值的 对数)和其他关系,你可以很容易地写出一个简单的代数公式得到你的高斯曲线的参数b,即它的最大值。

(我可能在计算中做错了,在使用结果之前仔细检查它们,无论如何程序应该是正确的)

(感谢 http://www.codecogs.com/latex/eqneditor.php 提供 LaTeX 方程)

【讨论】:

  • 该方程组在 alpha、beta 和 gamma 方面是线性的,因此求解非常容易。
  • @Ben:随意添加所有 Gauss-Jordan 步骤,就我而言,我今晚写了足够多的 LaTeX :P(我喜欢 LaTeX,但在这里它很麻烦) .
  • 比你!很好的解释和有用的链接!但是,我仍然不相信,没有可用的 C 库这样做。恐怕,我会自己实现它:-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2022-01-02
相关资源
最近更新 更多