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ń).
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ść.
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!
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)
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
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