Ich habe mich gefragt, ob es eine Möglichkeit gibt, durch Analysieren der Bilddaten festzustellen, ob ein Bild verschwommen ist oder nicht.
203
Ich habe mich gefragt, ob es eine Möglichkeit gibt, durch Analysieren der Bilddaten festzustellen, ob ein Bild verschwommen ist oder nicht.
Antworten:
Ja, so ist es. Berechnen Sie die schnelle Fourier-Transformation und analysieren Sie das Ergebnis. Die Fourier-Transformation zeigt an, welche Frequenzen im Bild vorhanden sind. Wenn nur wenige hohe Frequenzen vorhanden sind, ist das Bild verschwommen.
Es liegt an Ihnen, die Begriffe "niedrig" und "hoch" zu definieren.
Bearbeiten :
Wie in den Kommentaren angegeben, müssen Sie eine geeignete Metrik ausarbeiten , wenn Sie einen einzelnen Gleitkommawert wünschen, der die Unschärfe eines bestimmten Bildes darstellt.
Nikies Antwort liefert eine solche Metrik. Falten Sie das Bild mit einem Laplace-Kernel:
Verwenden Sie eine robuste maximale Metrik für die Ausgabe, um eine Zahl zu erhalten, die Sie für die Schwellenwertbildung verwenden können. Vermeiden Sie es, die Bilder zu stark zu glätten, bevor Sie den Laplace-Wert berechnen, da Sie nur feststellen werden, dass ein geglättetes Bild tatsächlich verschwommen ist :-).
quelle
Eine andere sehr einfache Möglichkeit, die Schärfe eines Bildes abzuschätzen, besteht darin, einen Laplace-Filter (oder LoG-Filter) zu verwenden und einfach den Maximalwert auszuwählen. Die Verwendung eines robusten Maßes wie eines 99,9% -Quantils ist wahrscheinlich besser, wenn Sie Rauschen erwarten (dh den n-ten höchsten Kontrast anstelle des höchsten Kontrasts auswählen). Wenn Sie eine unterschiedliche Bildhelligkeit erwarten, sollten Sie auch einen Vorverarbeitungsschritt zur Normalisierung der Bildhelligkeit einschließen. Kontrast (zB Histogrammausgleich).
Ich habe Simons Vorschlag und diesen in Mathematica implementiert und an einigen Testbildern ausprobiert:
Der erste Test verwischt die Testbilder mit einem Gaußschen Filter mit variierender Kernelgröße, berechnet dann die FFT des unscharfen Bildes und berechnet den Durchschnitt der 90% höchsten Frequenzen:
Ergebnis in einem logarithmischen Diagramm:
Die 5 Linien repräsentieren die 5 Testbilder, die X-Achse repräsentiert den Gaußschen Filterradius. Die Grafiken nehmen ab, daher ist die FFT ein gutes Maß für die Schärfe.
Dies ist der Code für den Schätzer für die "höchste LoG" -Unschärfe: Er wendet einfach einen LoG-Filter an und gibt das hellste Pixel im Filterergebnis zurück:
Ergebnis in einem logarithmischen Diagramm:
Die Streuung für die unscharfen Bilder ist hier etwas besser (2,5 gegenüber 3,3), hauptsächlich weil diese Methode nur den stärksten Kontrast im Bild verwendet, während die FFT im Wesentlichen ein Mittelwert über das gesamte Bild ist. Die Funktionen nehmen auch schneller ab, sodass es möglicherweise einfacher ist, einen "verschwommenen" Schwellenwert festzulegen.
quelle
Bei einigen Arbeiten mit einem Autofokus-Objektiv bin ich auf diese sehr nützlichen Algorithmen zur Erkennung des Bildfokus gestoßen . Es ist in MATLAB implementiert, aber die meisten Funktionen lassen sich mit filter2D recht einfach auf OpenCV portieren .
Es handelt sich im Grunde genommen um eine Umfrageimplementierung vieler Fokusmessalgorithmen. Wenn Sie die Originalarbeiten lesen möchten, finden Sie im Code Verweise auf die Autoren der Algorithmen. Das 2012 erschienene Papier von Pertuz et al. Die Analyse der Operatoren für Fokusmessungen auf Form aus Fokus (SFF) bietet eine hervorragende Übersicht über alle diese Messungen sowie über ihre Leistung (sowohl in Bezug auf Geschwindigkeit als auch Genauigkeit in Bezug auf SFF).
BEARBEITEN: MATLAB-Code für den Fall hinzugefügt, dass der Link stirbt.
Einige Beispiele für OpenCV-Versionen:
Keine Garantie dafür, ob diese Maßnahmen die beste Wahl für Ihr Problem sind oder nicht. Wenn Sie jedoch die mit diesen Maßnahmen verbundenen Dokumente aufspüren, erhalten Sie möglicherweise mehr Einblick. Ich hoffe, Sie finden den Code nützlich! Ich weiß, dass ich es getan habe.
quelle
Aufbauend auf der Antwort von Nike. Es ist einfach, die auf Laplace basierende Methode mit opencv zu implementieren:
Gibt einen Kurzschluss zurück, der die maximal erkannte Schärfe angibt. Dies basiert auf meinen Tests an realen Proben und ist ein ziemlich guter Indikator dafür, ob eine Kamera scharfgestellt ist oder nicht. Es überrascht nicht, dass Normalwerte szenenabhängig sind, aber viel weniger als die FFT-Methode, die eine zu hohe Falsch-Positiv-Rate aufweisen muss, um in meiner Anwendung nützlich zu sein.
quelle
Ich habe eine ganz andere Lösung gefunden. Ich musste Video-Standbilder analysieren, um das schärfste in jedem (X) Bild zu finden. Auf diese Weise würde ich Bewegungsunschärfe und / oder unscharfe Bilder erkennen.
Am Ende habe ich die Canny Edge-Erkennung verwendet und mit fast jeder Art von Video SEHR SEHR gute Ergebnisse erzielt (mit Nikies Methode hatte ich Probleme mit digitalisierten VHS-Videos und starken Interlaced-Videos).
Ich habe die Leistung optimiert, indem ich für das Originalbild einen Bereich von Interesse (ROI) festgelegt habe.
Verwenden von EmguCV:
quelle
Danke Nikie für diesen tollen Laplace-Vorschlag. OpenCV-Dokumente haben mich in die gleiche Richtung gelenkt: mit Python, cv2 (opencv 2.4.10) und numpy ...
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
numpy.max(cv2.convertScaleAbs(cv2.Laplacian(gray_image,3)))
Ergebnis ist zwischen 0-255. Ich fand, dass alles, was über 200 ist, sehr scharf ist, und um 100 ist es merklich verschwommen. Das Maximum wird nie wirklich viel unter 20, selbst wenn es vollständig verschwommen ist.
quelle
Eine Methode, die ich derzeit verwende, misst die Streuung der Kanten im Bild. Suchen Sie nach diesem Papier:
Es ist normalerweise hinter einer Paywall, aber ich habe einige kostenlose Exemplare gesehen. Grundsätzlich lokalisieren sie vertikale Kanten in einem Bild und messen dann, wie breit diese Kanten sind. Die Mittelung der Breite ergibt das endgültige Ergebnis der Unschärfeschätzung für das Bild. Breitere Kanten entsprechen verschwommenen Bildern und umgekehrt.
Dieses Problem gehört zum Bereich der Schätzung der Bildqualität ohne Referenz . Wenn Sie in Google Scholar nachschlagen, erhalten Sie zahlreiche nützliche Referenzen.
BEARBEITEN
Hier ist eine grafische Darstellung der Unschärfeschätzungen, die für die 5 Bilder in Nikies Beitrag erhalten wurden. Höhere Werte entsprechen einer größeren Unschärfe. Ich habe einen 11x11-Gauß-Filter mit fester Größe verwendet und die Standardabweichung variiert (mit dem
convert
Befehl von imagemagick , um die unscharfen Bilder zu erhalten).Vergessen Sie beim Vergleichen von Bildern unterschiedlicher Größe nicht, die Bildbreite zu normalisieren, da größere Bilder breitere Kanten haben.
Schließlich besteht ein erhebliches Problem darin, zwischen künstlerischer Unschärfe und unerwünschter Unschärfe zu unterscheiden (verursacht durch Fokusfehler, Komprimierung, Relativbewegung des Motivs zur Kamera), aber das geht über einfache Ansätze wie diesen hinaus. Schauen Sie sich als Beispiel für künstlerische Unschärfe das Lenna-Bild an: Lennas Spiegelbild ist verschwommen, aber ihr Gesicht ist perfekt fokussiert. Dies trägt zu einer höheren Unschärfeschätzung für das Lenna-Bild bei.
quelle
Ich habe eine Lösung basierend auf dem Laplace-Filter aus diesem Beitrag ausprobiert . Es hat mir nicht geholfen. Also habe ich die Lösung aus diesem Beitrag ausprobiert und sie war gut für meinen Fall (ist aber langsam):
Weniger unscharfes Bild hat Maximum
sum
!Sie können Geschwindigkeit und Genauigkeit auch einstellen, indem Sie den Schritt ändern, z
dieser Teil
Sie können durch diesen ersetzen
quelle
Die obigen Antworten haben viele Dinge erläutert, aber ich denke, es ist nützlich, eine konzeptionelle Unterscheidung zu treffen.
Was ist, wenn Sie ein unscharfes Bild eines unscharfen Bildes perfekt fokussieren?
Das Problem der Unschärferkennung ist nur dann gut gestellt, wenn Sie eine Referenz haben . Wenn Sie beispielsweise ein Autofokus-System entwerfen müssen, vergleichen Sie eine Folge von Bildern, die mit unterschiedlichem Grad an Unschärfe oder Glättung aufgenommen wurden, und versuchen, den Punkt der minimalen Unschärfe innerhalb dieses Satzes zu finden. Mit anderen Worten, Sie müssen die verschiedenen Bilder mit einer der oben dargestellten Techniken verweisen (im Grunde genommen - mit verschiedenen möglichen Verfeinerungsstufen im Ansatz - nach dem einen Bild mit dem höchsten Hochfrequenzgehalt suchen).
quelle
Matlab-Code von zwei Methoden, die in angesehenen Fachzeitschriften veröffentlicht wurden (IEEE Transactions on Image Processing), finden Sie hier: https://ivulab.asu.edu/software
Überprüfen Sie die CPBDM- und JNBM-Algorithmen. Wenn Sie den Code überprüfen, ist es nicht sehr schwer, ihn zu portieren, und er basiert übrigens auf der Marzialiano-Methode als Grundfunktion.
quelle
Ich implementierte es mit fft in matlab und überprüfe das Histogramm des fft-Berechnungsmittelwerts und des std, aber es kann auch eine Anpassungsfunktion durchgeführt werden
quelle
Das mache ich in Opencv, um die Fokusqualität in einer Region zu erkennen:
quelle