2010-11-19 6 views
13

Ich versuche ein Autofokus-System für ein kostengünstiges USB-Mikroskop zu entwerfen. Ich habe die Hardwareseite mit einem Präzisions-PAP-Motor entwickelt, der in der Lage ist, den Fokusknopf in der microscope einzustellen, und jetzt bin ich in dem schwierigen Teil.Autofokus-Algorithmus für USB-Mikroskop

Ich habe über die Implementierung der Software nachgedacht. Die Hardware hat zwei USB-Ports, einen für die Mikroskopkamera und einen für den Motor. Meine anfängliche Idee ist, eine Anwendung in C# zu schreiben, die das Bild vom Mikroskop bekommen kann und den Motor vorwärts und rückwärts bewegt, so weit so gut :)

Jetzt brauche ich ein bisschen Hilfe mit dem Auto Fokus, wie man es umsetzt? Gibt es dafür einen guten Algorithmus? Oder vielleicht eine Bildverarbeitungsbibliothek, die mir bei meiner Aufgabe hilft?

Ich habe googleling aber ohne Erfolg ... Ich werde jede Hilfe/Idee/Empfehlung zu schätzen wissen!

Vielen Dank :)

EDIT: Danke Jungs für Ihre Antworten, ich werde alle Möglichkeiten versuchen, wieder hier mit den Ergebnissen (oder vielleicht mehr Fragen) bekommen.

+0

Das auf diese Frage ähnlich klingt - http://stackoverflow.com/questions/2134934/image-focus-calculation –

+0

Das ist richtig, ich habe nicht nachgewiesen, dass vor Post. Vielen Dank. – SubniC

+1

@SubniC Siehe auch http://Stackoverflow.com/a/32951113/15485 –

Antwort

6

Das wichtigste Stück ist Code, der Ihnen sagt, wie viel unscharf das Bild ist. Da ein unscharfes Bild Hochfrequenzdaten verliert würde ich so etwas wie das folgende versuchen:

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

Dieser Algorithmus funktioniert nicht gut, wenn das Bild verrauscht ist. In diesem Fall könnten Sie es herunterrechnen oder einen komplexeren Algorithmus verwenden.

Oder eine andere Idee, um die Variation der Pixelwerte wird die Berechnung:

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

Diese Funktionen auf monochromatische Bilder arbeiten, für RGB-Bilder nur die Werte für die Kanäle summieren.

Mit dieser Funktion ändern Sie den Fokus bei der Maximierung CalculateFocusQuality. Erhöhen Sie die Schrittweite, wenn mehrere Versuche hintereinander die Qualität verbessert haben, und verringern Sie die Schrittweite, wenn der Schritt die Qualität verringert.

+0

Danke CodeInChaos, ich werde dein snnipet versuchen und dir sagen, wie es funktioniert :) – SubniC

+0

Es gibt einen kleinen Tippfehler in deinen Algorithmen: deine y-Schleife vergleicht x mit der Höhe. Würde der zweite Algorithmus auch keine höhere Punktzahl für ein rein weißes Bild ergeben als für ein alternierendes weiß-schwarzes Schachbrettmuster? Das scheint falsch, da das Schachbrett "mehr im Fokus" ist. – Mike

+0

@noroom Danke. Kein Algorithmus hat getan, was ich vorhatte. Sollte jetzt behoben werden. Bitte lassen Sie mich wissen, wenn Sie einen anderen Fehler finden. – CodesInChaos

0

Dort auf Wikipedia

Technisch einige Informationen sind kann es als Hochpassfilter und einiges System implementiert werden, die Linse um den Punkt gewissenhaft bewegt, wo Filterausgang am höchsten ist. digitale Verarbeitung ist nicht erforderlich,

Auch 5 aus den ersten 6 Spielen I von Googeln für „Autofokus-Algorithmus“ scheinen, relevante und nützliche Informationen zu haben (auch wenn in einem oder zwei Fällen sind die vollständigen Details der Papiere erfordern Zahlung)

+0

Hallo Paul, danke für Ihre Zeit zu beantworten, kenne ich bereits die Wikipedia-Seite , bitte niemals vor der Suche. Vielleicht bin ich nicht so klar über Google :) Ich suchte danach, aber ich fand keinen Algorithmus, den ich verstehen könnte, mein mathematischer Hintergrund ist nicht so stark, deswegen bitte ich hier um Hilfe. – SubniC

+0

OK. Aber ich denke, dass Sie für diese eine gute Mathematik brauchen werden ... –

+0

Ich werde versuchen, es zu lernen, wenn ich nicht kann, werde ich einige finden, um mir zu helfen. Aber für den Anfang ist es wirklich schön, die Leute hier, um Sie in die richtige Richtung zu bringen :) – SubniC

6

Die Autofokussierung eines Mikroskops ist ein langjähriges Thema in der optischen Forschung.
Sie können ein wenig über die beteiligten Algorithmen here lernen.

Die Probleme bestehen nicht nur darin, Defokussierung zu messen, sondern auch, wie man die optische Achse optimal bewegt und wie man die Restfehler algorithmisch korrigiert.

HTH!

+0

Hallo Belisarius, sehr interessantes Papier, ich werde versuchen, einige Informationen zu bekommen, die mir helfen können. Grüße. – SubniC

0

nur einige meiner Erfahrungen versuchen, ähnliche Aufgabe zu lösen. Auf meinem System wird eine 200x Vergrößerung verwendet. Schrittauflösung in Z-Richtung 0.001um.

Die Probleme, die ich konfrontiert habe: -Shaking. Das Bild auf theoretisch besserer Position könnte schlechter bewertet werden, da es plötzlich schütteln würde. Da die API meines Systems es nicht erlaubte, z-axix zu bewegen und Bilder parallel zu machen, musste ich mich schrittweise bewegen und sequentiell erfassen. Jeder Bewegungsstopp verursachte ein Zittern. Interessanterweise war das Zittern bei der Abwärtsbewegung stärker als bei der Aufwärtsbewegung.

-Mechanische Ungenauigkeit. Wenn Sie einen Scan durchführen und zur theoretisch besten Position wechseln, kann dies zu einem Fehler führen, da die Stepper-Position im Controller möglicherweise nicht mit der mechanischen Position übereinstimmt.

-Exposition: Je nach Anwendung kann die Helligkeit des Bildes variieren, sodass die Belichtung angepasst werden sollte. In Abhängigkeit von dem Fokus-Bewertungsalgorithmus (ob die Helligkeit in die Berechnung einbezogen ist oder nicht) muss die Belichtung möglicherweise festgelegt werden. Daraus ergibt sich das Henne-Ei-Problem - wie man die Belichtung einstellt, ob die Bildhelligkeit unbekannt ist und wie man fokussiert, wenn die Belichtung nicht bekannt ist.

Schließlich, um mechanische Probleme zu vermeiden, habe ich das beste Bild, das ich während der Fokussierung gefunden habe, (wieder) gespeichert und es am Ende zurückgegeben. In Bezug auf den Algorithmus für den Fokus-Wert, war die beste Suche nach Kanten kombiniert mit der gesamten Anzahl von Farben (Histogrammbreite). Aber das hängt natürlich von der Art des Bildes ab, das Sie verarbeiten.

Grüße, Valentin Heinitz

Verwandte Themen