Алгоритм автофокуса для USB-микроскопа - PullRequest
15 голосов
/ 19 ноября 2010

Я пытаюсь разработать систему автофокуса для недорогого USB-микроскопа.Я разрабатывал аппаратную часть с помощью точного двигателя PAP, который может регулировать ручку фокусировки в микроскопе , и теперь я нахожусь в сложной части.

Я думало том, как реализовать программное обеспечение.Аппаратное обеспечение имеет два порта USB, один для камеры микроскопа, а другой для двигателя.Моя первоначальная идея состоит в том, чтобы написать приложение на C #, которое сможет получать изображение с микроскопа и двигать мотор вперед и назад, пока все хорошо:)

Теперь мне нужно немного помочь савтофокус, как это реализовать?Есть ли хороший алгоритм для этого?Или, может быть, библиотека обработки изображений, которая поможет мне в моей задаче?

Я гуглил, но безуспешно ... Буду благодарен за любую помощь / идею / рекомендацию!

Большое спасибо:)

РЕДАКТИРОВАТЬ: Спасибо, ребята за ваши ответы, я опробую все варианты и вернусь сюда с результатами (или, возможно, больше вопросов).

Ответы [ 4 ]

8 голосов
/ 19 ноября 2010

Самая важная часть - это код, который говорит вам, насколько не в фокусе изображение. Поскольку несфокусированное изображение теряет высокочастотные данные, я бы попробовал что-то вроде следующего:

long CalculateFocusQuality(byte[,] pixels)
{
  long sum = 0;
  for(int y = 0; y<height-1; y++)
    for(int x=0; x<width-1; x++)
    {
      sum += Square(pixels[x+1, y] - pixels[x, y]);
      sum += Square(pixels[x, y] - pixels[x, y+1]);
    }
  return sum;
}

int Square(int x)
{
  return x*x;
}

Этот алгоритм плохо работает, если изображение зашумлено. В этом случае вы можете уменьшить его или использовать более сложный алгоритм.

Или другая идея - вычисление вариации значений пикселей:

long CalculateFocusQuality(byte[,] pixels)
{
  long sum = 0;
  long sumOfSquares = 0;
  for(int y=0; y<height; y++)
    for(int x=0; x<width; x++)
    {
      byte pixel=pixels[x,y];
      sum+=pixel;
      sumofSquares+=pixel*pixel;
    }
  return sumOfSquares*width*height - sum*sum;
}

Эти функции работают на монохроматических изображениях, для изображений RGB просто суммируйте значения для каналов.

Используя эту функцию, измените фокус, пытаясь максимизировать CalculateFocusQuality. Увеличьте размер шага, если несколько попыток подряд улучшили качество, и уменьшите его и измените направление, если шаг уменьшил качество.

6 голосов
/ 19 ноября 2010

Автофокусировка в микроскопе - давняя тема оптических исследований.
Вы можете немного узнать об задействованных алгоритмах здесь .

Проблемы заключаются не только в том, как измерить расфокусировку, но и в том, как оптимально переместить оптическую ось, и в том, как алгоритмически исправить остаточные аберрации.

НТН!

0 голосов
/ 29 мая 2012

только некоторые из моих опытов пытаются решить аналогичную задачу.В моей системе используется 200-кратный магнификатин.Шаговый резольутин в направлении Z 0,001um.

Проблемы, с которыми я столкнулся: - встряхивание.Изображение в теоретически лучшем положении может быть оценено хуже из-за внезапного сотрясения.Поскольку API моей системы не позволял перемещать z-axix и создавать изображения параллельно, мне приходилось перемещаться поэтапно и снимать последовательно.Каждый шаг-остановка вызывал дрожь.Интересно, что тряска была более сильной при движении вниз, чем при движении вверх.

- Механическая неточность.Выполнение сканирования и перемещение в теоретически лучшее положение может привести к ошибке, поскольку положение шагового регулятора в контроллере может отличаться от механического положения.

-экспозиция: в зависимости от области применения яркость изображения можетварьируются, так что экспозиция должна быть скорректирована.В зависимости от алгоритма оценки фокуса (независимо от того, участвует ли яркость в расчете или нет), экспозиция может потребоваться зафиксировать.Это приводит к проблеме куриного яйца - как настроить экспозицию, если яркость изображения неизвестна, и как сфокусироваться, если необходимая экспозиция неизвестна.

Наконец, чтобы избежать механических проблем, я (повторно) сохранил лучшее изображение, найденное при фокусировке, и вернул его в конце.Что касается алгоритма для значения фокуса, лучше всего искать края в сочетании с полным количеством цветов (ширина гистограммы).Но, конечно, это зависит от типа изображения, которое вы обрабатываете.

С уважением, Валентин Хайниц

0 голосов
/ 19 ноября 2010

В Википедии

имеется некоторая техническая информация. Технически это может быть реализовано как фильтр верхних частот и система, которая добросовестно перемещает линзу вокруг точки, где выход фильтра наиболее высок.Цифровая обработка не требуется

Кроме того, 5 из первых 6 совпадений, которые я получаю от Googling за «алгоритм автофокуса», по-видимому, содержат важную и полезную информацию (хотя в одном или двух случаях полные сведения одокументы требуют оплаты)

...