Алгоритм автофокусировки для USB-микроскопа

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

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

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

Я был googleling, но без успеха... Я буду признателен за любую помощь/идею/рекомендацию!

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

EDIT: Спасибо, ребята, за ваши ответы, я попробую все варианты и вернусь сюда с результатами (или, может быть, с большим количеством вопросов).

Ответ 1

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

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. Увеличьте настройку, если несколько попыток подряд улучшили качество и уменьшили его и изменили направление, если шаг уменьшил качество.

Ответ 2

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

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

НТН!

Ответ 3

Есть некоторая информация о Wikipedia

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

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

Ответ 4

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

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

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

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

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

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