Algorytm autofokusa dla mikroskopu USB

Próbuję zaprojektować system auto-focus dla niedrogiego mikroskopu USB. Rozwijałem stronę sprzętową z precyzyjnym silnikiem PAP, który jest w stanie regulować pokrętło ostrości w mikroskopie , i teraz jestem w trudnej części.

Myślałem o tym, jak zaimplementować oprogramowanie. Sprzęt ma dwa porty USB, jeden dla Kamery mikroskopowej, a drugi dla silnika. Moim początkowym pomysłem jest napisanie aplikacji w C#, która będzie w stanie uzyskać obraz z mikroskop i poruszanie silnikiem do przodu i do tyłu, jak na razie tak dobrze:) [3]}

Teraz potrzebuję trochę pomocy z autofokusem, jak go zaimplementować? Jest na to jakiś dobry algorytm? A może biblioteka przetwarzania obrazu, która pomoże mi w moim zadaniu?

Googlowałem, ale bez powodzenia... Będę wdzięczny za każdą pomoc/pomysł / rekomendację!

Wielkie dzięki:)

EDIT: Dzięki chłopaki za odpowiedzi, spróbuję wszystkich opcji i wrócę tu z wyniki (a może więcej pytań).

Author: SubniC, 2010-11-19

4 answers

Najważniejszą częścią jest kod, który mówi, jak bardzo nieostre jest zdjęcie. Ponieważ nieostre zdjęcie traci dane o wysokiej częstotliwości, spróbowałbym czegoś takiego:

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;
}

Ten algorytm nie działa dobrze, jeśli obraz jest hałaśliwy. W takim przypadku można go zmniejszyć lub użyć bardziej złożonego algorytmu.

Lub innym pomysłem jest obliczanie zmienności wartości pikseli:

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;
}

Te funkcje działają na obrazach monochromatycznych, dla obrazów RGB tylko sumują wartości dla kanałów.

Używając tej funkcji Zmień ostrość próbując zmaksymalizować CalculateFocusQuality. Zwiększ rozmiar kroku, jeśli kilka prób pod rząd poprawiło jakość, i zmniejsz go i odwróć kierunek, jeśli krok zmniejszył jakość.

 7
Author: CodesInChaos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-07 20:02:24

Autofokusowanie mikroskop jest od dawna tematem badań optycznych.
Możesz dowiedzieć się trochę o algorytmach tutaj .

Problem polega nie tylko na tym, jak mierzyć defokację, ale także jak poruszać osią optyczną w optymalny sposób i jak algorytmicznie korygować aberracje resztkowe.

HTH!

 6
Author: Dr. belisarius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 12:39:28

Na Wikipedii

Technicznie można go zaimplementować jako filtr górnoprzepustowy i jakiś system, który sumiennie porusza obiektywem po punkt, w którym wyjście filtra jest najwyższe. Przetwarzanie cyfrowe nie jest wymagane

Ponadto, 5 z pierwszych 6 meczów, które otrzymuję z googlowania dla "algorytmu autofocus", wydaje się mieć istotne i przydatne informacje (chociaż w jednym lub dwóch przypadkach Pełne Dane prac wymagają zapłaty)

 0
Author: The Archetypal Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 12:31:20

To tylko niektóre z moich doświadczeń próbujących rozwiązać podobne zadanie. W moim systemie jest używany magnificatin 200x. Stepper resolutin w kierunku Z 0.001 um.

The problems I ' ve became: - Trzęsę się. Obraz na teoretycznie lepszej pozycji może być oceniany gorzej z powodu nagłego wstrząsu. Ponieważ API mojego systemu nie pozwalało na przesuwanie z-axix i tworzenie obrazów równolegle, musiałem poruszać się krok po kroku i rejestrować kolejno. Każdy ruch-stop spowodował drżenie. Co ciekawe, wstrząsy były bardziej dotkliwe podczas poruszania się w dół niż w górę.

- nieprecyzyjność mechaniczna. Wykonanie skanowania i przejście do teoretycznie najlepszej pozycji może spowodować błąd, ponieważ pozycja Krokowa w sterowniku może nie być taka sama jak pozycja mechaniczna.

- ekspozycja: w zależności od zastosowania jasność obrazu może się różnić, dlatego należy dostosować ekspozycję. W zależności od algorytmu oceny ostrości (niezależnie od tego, czy jasność jest zaangażowana w obliczenia, czy nie), ekspozycja może być naprawione. Powoduje to problem z jajkiem kurzym - jak ustawić ekspozycję, jeśli jasność obrazu jest nieznana i jak ustawić ostrość, jeśli wymagana ekspozycja jest nieznana.

Wreszcie, aby uniknąć problemów mechanicznych, zapisałem (ponownie)najlepszy znaleziony obraz podczas ustawiania ostrości i zwróciłem go na końcu. Jeśli chodzi o algorytm wartości ostrości, najlepiej było szukać krawędzi połączonych z całą liczbą kolorów (szerokość histogramu). Ale przyczyna zależy od rodzaju przetwarzanego obrazu.

Pozdrawiam, Valentin Heinitz

 0
Author: Valentin Heinitz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-29 17:32:57