Ищем библиотеку C / C ++, вычисляющую максимум кривой Гаусса с использованием дискретных значений - PullRequest
1 голос
/ 15 августа 2011

У меня есть некоторые дискретные значения и предположение, что эти значения лежат на кривой Гаусса. Должен быть алгоритм для максимального расчета, использующий только 3 дискретных значения. Знаете ли вы какую-либо библиотеку или код на C / C ++, реализующий эти вычисления?

Спасибо!

P.S .: Первоначальная задача - реализация автофокуса. Я перемещаю (микроскоп) камеру и снимаю фотографии в разных положениях. Позиция, имеющая самые разные цвета, должна иметь лучший фокус.

EDIT Это было давно :-( Я просто хотел снять этот вопрос, но оставил его, учитывая хороший ответ.

1 Ответ

9 голосов
/ 15 августа 2011

У вас есть три точки, которые должны быть на кривой Гаусса; это означает, что они лежат на функции:

generic Gaussian function

Если вы возьмете логарифм этой функции, вы получите:

log of the Gaussian function

, который является простым полиномом 2-го класса, то есть параболой с вертикальной осью симметрии:

generic 2nd grade polynomial

с

coefficient definitions

Итак, если вы знаете три коэффициента параболы, вы можете вывести параметры кривой Гаусса; кстати, единственный параметр гауссовой функции, который представляет для вас определенный интерес, - это b , поскольку он сообщает вам, где находится центр распределения, т.е. где находится его максимум. Это сразу же выяснить, что

b from beta and alpha

Все, что остается сделать, это подогнать параболу (с «оригинальным» x и логарифмом ваших значений). Теперь, если бы у вас было больше точек, было бы использовано полиномиальное соответствие, но, поскольку у вас есть только три точки, ситуация действительно проста: есть одна и только одна парабола, которая проходит через три точки.

Теперь вам просто нужно написать уравнение параболы для каждой из ваших точек и решить систему:

system of the three points

y and z, где z s - фактические значения, считанные в соответствующем x)

Это может быть решено вручную (с некоторым временем), с некоторым CAS или ... , глядя на StackOverflow :); решение таким образом:

solution of the parabola through three points

Итак, используя эти последние уравнения (помните: y s - это логарифм ваших «реальных» значений) и другие отношения, вы можете легко написать простую алгебраическую формулу, чтобы получить параметр b вашей гауссовой кривой, т.е. его максимум.

final result

(возможно, в расчетах произошел какой-то беспорядок, дважды проверьте их перед использованием результатов, в любом случае процедура должна быть правильной)

(спасибо http://www.codecogs.com/latex/eqneditor.php за уравнения LaTeX)

...