2010-11-19 8 views
13

Próbuję zaprojektować system automatycznego ogniskowania dla taniego mikroskopu USB. Pracowałem nad sprzętową stroną z precyzyjnym silnikiem PAP, który jest w stanie wyregulować pokrętło ostrości w microscope, a teraz jestem w trudnej sytuacji.Algorytm autofokusa do mikroskopu USB

Myślałem o tym, jak zaimplementować oprogramowanie. Sprzęt ma dwa porty USB, jeden dla kamery mikroskopu i drugi dla silnika. Moim początkowym pomysłem jest napisanie aplikacji w języku C#, która jest w stanie pobrać obraz z mikroskopu i przesuwać silnik do przodu i do tyłu, do tej pory tak dobrze :)

Teraz potrzebuję trochę pomocy z automatami skupić się, jak go wdrożyć? Czy jest na to jakiś dobry algorytm? A może biblioteka przetwarzania obrazu, która pomoże mi w moim zadaniu?

Byłem googlelingiem, ale bez powodzenia ... Docenię każdą pomoc/pomysł/rekomendację!

Dziękujemy :)

EDIT: Dzięki chłopaki za odpowiedzi, będę próbować wszystkie opcje i wrócić tu z wynikami (a może więcej pytań).

+0

ten brzmi podobnie do tego pytania - http://stackoverflow.com/questions/2134934/image-focus-calculation –

+0

To prawda, nie miałem wcześniej pokazać, że post. dzięki. – SubniC

+1

@SubniC Zobacz także http://stackoverflow.com/a/32951113/15485 –

Odpowiedz

6

Najważniejszym elementem jest kod, który pokazuje, jak bardzo nieostry jest obraz. Ponieważ nieostry obraz traci danych wysokiej częstotliwości chciałbym spróbować czegoś tak:

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

Algorytm ten nie działa dobrze, jeśli obraz jest głośny. W takim przypadku możesz go zmniejszyć lub użyć bardziej złożonego algorytmu.

Albo inny pomysł jest obliczenie wariancji 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; 
} 

Funkcje te działają na monochromatycznych obrazów na obrazy RGB prostu zsumować wartości dla kanałów.

Za pomocą tej funkcji zmień ostrość, próbując zmaksymalizować wartość CalculateFocusQuality. Zwiększ liczbę kroków, jeśli kilka prób z rzędu poprawiło jakość, i zmniejsz ją i odwróć kierunek, jeśli krok obniżył jakość.

+0

Dzięki CodeInChaos, spróbuję twojej pociechy i opowiem ci jak to działa :) – SubniC

+0

W twoich algorytmach jest mała literówka: twoja pętla y porównuje x z wysokością. Czy drugi algorytm nie uzyskałby wyższego wyniku w przypadku obrazu całkowicie białego niż na przemian biało-czarnego wzoru szachownicy? To wydaje się błędne, ponieważ szachownica jest "bardziej skoncentrowana". – Mike

+0

@noroom Dzięki. Żaden z algorytmów nie robił tego, co zamierzałem. Powinien być teraz naprawiony. Daj mi znać, jeśli znajdziesz kolejny błąd. – CodesInChaos

0

Istnieje kilka informacji na Wikipedia

Technicznie może być realizowany jako filtr górnoprzepustowy i pewnego systemu, który sumiennie przesuwa obiektyw wokół punktu gdzie wyjście filtr jest najwyższa. Cyfrowe przetwarzanie nie jest wymagane

Także na 5 z pierwszych 6 meczów dostaję od Googling dla „algorytmu autofocus” wydają się mieć istotne i przydatne informacje (choć w jednym lub w dwóch przypadkach pełne dane o dokumentach wymaga płatności)

+0

Witaj Paul, dzięki za twój czas odpowiedzi, znam już stronę wikipedii , nigdy nie pytaj przed wyszukiwaniem. Może nie jestem tak jasna w Google'u :) szukałem go, ale nie znalazłem żadnego algorytmu, który mógłbym zrozumieć, moje matematyczne tło nie jest tak silne, dlatego proszę o pomoc. – SubniC

+0

OK. Ale myślę, że będziesz potrzebował sporo matematyki do tego ... –

+0

Spróbuję się tego nauczyć, jeśli nie mogę, to znajdę kilka, którzy mi pomogą. Ale na początek jest naprawdę miło, że ludzie tutaj chcą, abyście kierowali się właściwym kierunkiem :) – SubniC

6

Autofocowanie mikrokososkopu jest od dawna tematem w badaniach optycznych.
Możesz dowiedzieć się trochę o zaangażowanych algorytmach here.

Problemy dotyczą nie tylko tego, w jaki sposób można uzyskać rozmycie, ale także w jaki sposób optymalnie poruszać osią optyczną i jak korygować algorytmicznie aberracje szczątkowe.

HTH!

+0

Cześć Belizariusz, bardzo interesujący artykuł, spróbuję uzyskać informacje, które mogą mi pomóc. pozdrowienia. – SubniC

0

to tylko niektóre z moich doświadczeń próbujących rozwiązać podobne zadanie. W moim systemie zastosowano 200-krotny magnificatin. Stepper resolutin w kierunku Z 0,001um.

Problemy, z którymi miałem do czynienia: -Shaking. Obraz na teoretycznie lepszej pozycji mógłby być gorszy z powodu nagłego drżenia. Ponieważ interfejs API mojego systemu nie pozwalał na przenoszenie z-axix i robienie zdjęć równolegle, musiałem poruszać się krok po kroku i przechwytywać sekwencyjnie. Każdy ruch-stop powodował drżenie. Co ciekawe, wstrząsy były bardziej dotkliwe podczas schodzenia w dół niż wznoszenia się.

-Nieumiejętność mechaniczna. Wykonanie skanowania i przejście do teoretycznie najlepszej pozycji może być przyczyną błędu, ponieważ pozycja w sterowniku może różnić się od pozycji mechanicznej.

-Wykrycie: W zależności od aplikacji jasność obrazu może być różna, dlatego ekspozycja powinna zostać dostosowana. W zależności od algorytmu oceny ostrości (czy w obliczeniach bierze udział jasność), może być wymagane usunięcie ekspozycji. Powoduje to problem z jajkiem kurzego - jak ustawić ekspozycję, jeśli jasność obrazu jest nieznana i jak ustawić ostrość, jeśli wymagana ekspozycja jest nieznana.

Na koniec, aby uniknąć problemów z mechaniką, zapisałem (am) najlepsze zdjęcie znalezione podczas ustawiania ostrości i zwróciłem je na końcu. W odniesieniu do algorytmu wartości skupienia, najlepsze było szukanie krawędzi w połączeniu z całą liczbą kolorów (szerokość histogramu). Ale z przyczyn zależy to od rodzaju przetwarzanego obrazu.

Pozdrawiam, Valentin Heinitz