Frage

Ich versuche, einen Bildfokussierungsalgorithmus für einige Testautomatisierungsarbeiten zu entwickeln.Ich habe mich für AForge.net entschieden, da es ein schönes, ausgereiftes, .net-freundliches System zu sein scheint.

Leider kann ich keine Informationen zum Erstellen von Autofokus-Algorithmen von Grund auf finden, also habe ich mein Bestes gegeben:

Bild machen.Wenden Sie den Sobel-Kantenerkennungsfilter an, der einen Graustufen-Kantenumriss generiert.Erzeugen Sie ein Histogramm und speichern Sie die Standardentwicklung.Bewegen Sie die Kamera einen Schritt näher an das Motiv und machen Sie ein weiteres Bild.Wenn die Standardentwicklung kleiner ist als die vorherige, rücken wir stärker in den Fokus.andernfalls haben wir die optimale Entfernung zum Fotografieren überschritten.

Gibt es einen besseren Weg?

aktualisieren:Das ist übrigens ein riesiger Fehler.wie ich es verstehe Vergangenheit Mit dem optimalen Fokuspunkt wächst mein „Bild im Fokus“-Wert weiter.Man würde eine parabolische Funktion erwarten, wenn man den Abstand/Fokus-Wert betrachtet, aber in Wirklichkeit erhält man etwas, das eher logarithmisch ist

Update 2:Okay, also bin ich darauf zurückgekommen und die aktuelle Methode, die wir untersuchen, erhält ein paar bekannte Kanten (okay, ich weiß also genau, um welche Objekte im Bild es sich handelt). Ich führe einen manuellen Vergleich der Pixelintensität durch.Je steiler die resultierende Grafik wird, desto stärker konzentriere ich mich.Ich werde Code posten, sobald der Kernalgorithmus von Matlab nach C# portiert wurde (ja, Matlab ...:S)

Update 3:Juhu, letztes Update.bin noch einmal darauf zurückgekommen.der finale Code sieht so aus:

Schritt 1:Holen Sie sich ein Bild aus der Liste der Bilder (ich habe hundert Fotos durch den fokussierten Punkt gemacht)

Schritt 2:Finden Sie eine Kante für das Objekt, das ich fokussiere. (In meinem Fall handelt es sich um ein rechteckiges Objekt, das sich immer an der gleichen Stelle befindet. Daher schneide ich ein HOCH- und SCHMAL-Rechteck einer Kante zu.)

Schritt 3:Holen Sie sich die HorizontalIntensityStatistics (Aforge.net-Klasse) für dieses zugeschnittene Bild.

Schritt 4:Holen Sie sich das Histogramm (in meinem Fall grau)

Schritt 5:Finden Sie die Ableitung der Werte des Histogramms

Schritt 6:Wenn Ihr Gefälle am größten ist, befinden Sie sich am konzentriertesten Punkt.

War es hilfreich?

Lösung

Es mag für Ihre Anforderungen etwas vereinfacht sein, aber ich habe mit einem einfachen Algorithmus, der den Unterschied zu benachbarten Pixeln berücksichtigt, gute Ergebnisse erzielt.Die Summe der Pixeldifferenz im Abstand von 2 scheint ein sinnvolles Maß für den Bildkontrast zu sein.Ich konnte das Originalpapier von Brenner aus den 70er Jahren nicht finden, aber es wird in erwähnt http://www2.die.upm.es/im/papers/Autofocus.pdf

Ein weiteres Problem besteht darin, dass, wenn das Bild extrem unscharf ist, nur sehr wenige Fokusinformationen vorhanden sind, so dass es schwierig ist, zu sagen, in welche Richtung es „näher“ geht, oder ein lokales Maximum zu vermeiden.

Andere Tipps

Sie können sich die Technik ansehen, die in der NASA Curiosity Mars Rover verwendet wird.

Die Technik wird in diesem Artikel beschrieben

Edgett, Kenneth S., et al. Curgosity's Mars Hand Lens Imager (Mahli) Untersuchung. Space Science Reviews, 2012, 170.1-4: 259-317.

Welches ist als erhältlich PDF hier.

Zitat aus dem Artikel:

7.2.2 Autofokus

Es wird erwartet, dass Autofokus die primäre Methode ist, mit der sich Mahli auf Mars konzentriert. Der Autofokusbefehl weist die Kamera an, in eine bestimmte Position der Startmotor zu wechseln und ein Bild zu sammeln, eine bestimmte Anzahl von Schritten zu verschieben und ein anderes Bild zu sammeln, bis eine befehlende Gesamtzahl der Bilder erreicht ist, die jeweils durch einen bestimmten Motor getrennt sind Zählinkrement. Jedes dieser Bilder ist JPEG komprimiert (Joint Photographic Experts Group; siehe CCitt (1993)) mit dem gleichen Komprimierungsqualitätsfaktor. Die Dateigröße jedes komprimierten Bildes ist ein Maß für das Szenendetail, das wiederum eine Funktion des Fokus ist (ein Fokusbild zeigt mehr Details als eine verschwommene Sichtweise derselben Szene). Wie in Abb. 23 dargestellt, bestimmt die Kamera die Beziehung zwischen der Größe der JPEG -Datei und der Motorzahl und passt zu einer Parabel zu den drei benachbarten maximalen Dateigrößen. Der Scheitelpunkt der Parabola liefert eine Schätzung der besten Position des besten Fokus -Motors. Nachdem Mahli diese Entschlossenheit getroffen hat, bewegt er die Linsenfokusgruppe in die beste motorische Position und erwirbt ein Bild. Dieses Bild wird gespeichert, die früheren Bilder zur Bestimmung der Autofokusposition werden nicht gespeichert.

Autofokus kann über das gesamte Sichtfeld von Mahli durchgeführt werden, oder es kann auf einem Unterrahmen durchgeführt werden, der dem Teil der Szene entspricht, der die zu untersuchenden Objekte enthält. Abhängig von der Art des Subjekts und der Kenntnis der Unsicherheiten bei der Positionierung von Roboterarm von Mahli könnten Benutzer einen zentrierten Autofokus-Unterrahmen erwerben, oder sie könnten einen Off-Center-Autofokus-Unterrahmen auswählen, wenn die Positionierung von Wissen ausreicht, um festzustellen, wo sich befinden Der Unterrahmen sollte sich befinden. Die Verwendung von Unterabläufen zur Durchführung von Autofokus wird dringend empfohlen, da dies normalerweise dazu führt, dass das Subjekt einen besseren Fokus ist als der Fall, wenn der Autofokus auf die vollständige CCD angewendet wird. Darüber hinaus führt die resultierende Motorzahlposition aus dem Autofokus unter Verwendung eines Unterfristen normalerweise zu einer genaueren Bestimmung des Arbeitsabstands von der Pixelskala.

Das Folgende ist Abbildung 23:

Autofocus in NASA Curiosity Mars Rover

Diese Idee wurde auch in dieser Antwort vorgeschlagen: https://stackoverflow.com/a/2173259/15485

Dies könnte nützlich sein. So funktioniert das AF -System der Kamera tatsächlich - Passiver Autofokus

Kontrastmessung

Die Kontrastmessung wird erreicht, indem der Kontrast innerhalb eines Sensorfelds durch die Linse messen. Der Intensitätsunterschied zwischen benachbarten Pixeln des Sensors nimmt natürlich mit dem richtigen Bildfokus zu. Das optische System kann dadurch eingestellt werden, bis der maximale Kontrast erkannt wird. Bei dieser Methode beinhaltet AF überhaupt keine tatsächliche Entfernungsmessung und ist im Allgemeinen langsamer als Phasenerkennungssysteme, insbesondere beim Betrieb bei schwachem Licht. Da es keinen separaten Sensor verwendet, kann der Autofokus des Kontrastmittelers jedoch flexibler sein (wie in Software implementiert) und möglicherweise genauer. Dies ist eine häufige Methode bei Videokameras und Digitalkameras auf Verbraucherebene, bei denen es fehlt, Fensterläden und Reflexspiegel. Einige DSLRs (einschließlich Olympus E-420, Panasonic L10, Nikon D90, Nikon D5000, Nikon D300 im Stativmodus, Canon EOS 5D Mark II, Canon EOS 50D) verwenden diese Methode, wenn sie sich in ihren Live-View-Modi konzentrieren. Ein neues austauschbares Lens-System, Micro Four Thirds, verwendet ausschließlich den Autofokus der Kontrastmessung und bietet eine Leistung, die mit Phasenerkennungssystemen vergleichbar ist.

Ich habe selbst keinen gebaut, aber mein erster Gedanke wäre, einen 2D -DFT auf einem Teil des Bildes zu machen. Bei unscharfem Fokus verschwinden hohe Frequenzen automatisch.

Für einen faulen Prototyp können Sie versuchen, einen Bereich des Bildes mit JPEG (hohe Qualität) zu komprimieren und die Ausgangsstromgröße zu betrachten. Eine große Datei bedeutet viele Details, was wiederum impliziert, dass das Bild im Fokus steht. Achten Sie darauf, dass die Kamera nicht zu laut sein sollte und dass Sie die Dateigrößen natürlich nicht über verschiedene Szenen hinweg vergleichen können.

Während der Sobel eine anständige Wahl ist, würde ich wahrscheinlich eine Berechnung der Kantengröße für die Projektionen in x- und y -Richtungen über mehrere kleine repräsentative Regionen durchführen. Eine weitere .NET -freundliche Auswahl basierend auf OpenCV ist @ http://www.emgu.com/wiki/index.php/main_page.

Ich frage mich, ob die Standardabweichung die beste Wahl ist: Wenn das Bild schärfer wird, enthält das Sobel -Filterbild hellere Pixel an den Kanten, aber gleichzeitig weniger helle Pixel, da die Kanten dünner werden. Vielleicht könnten Sie versuchen, einen Durchschnitt der 1% der höchsten Pixelwerte im Sobel -Bild zu verwenden?

Ein weiterer Geschmack für die Fokusmetrik könnte sein:

Nehmen Sie mehrere Bilder und haben Sie durchschnittlich (Rauschreduktion). Dann fft das gemittelte Bild und verwenden Sie das Energieverhältnis mit hoher bis niedriger Frequenzen. Je höher diese Ration, desto bessere Fokus. Eine Matlab -Demo ist in den Demos der Toolbox verfügbar (ohne die Mittelungsphase) :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top