Die meisten modernen mobilen Kameras haben eine Familie von Techniken namens Bildstabilisierung, um wackelige Effekte in Fotos aufgrund der Bewegung des Kameraobjektivs oder der zugehörigen Hardware zu reduzieren. Aber immer noch eine ganze Reihe von mobilen Kameras erzeugen wackelige Fotos. Gibt es einen zuverlässigen Algorithmus oder eine Methode, die auf mobilen Geräten implementiert werden kann, speziell auf Android, um herauszufinden, ob ein gegebenes Bild wackelig ist oder nicht? Ich erwarte nicht, dass der Algorithmus das Eingabebild stabilisiert, aber der Algorithmus / die Methode sollte zuverlässig einen definitiven Booleschen Wert zurückgeben, egal ob das Bild wackelig ist oder nicht. Es muss nicht Java sein, sondern kann auch C / C ++ sein, so dass man es über das native Kit erstellen und die APIs der obersten Ebene zugänglich machen kann. Die folgende Abbildung beschreibt das erwartete Ergebnis. Diese Frage beschäftigt sich auch mit einzelnen Bildproblemen, daher funktionieren in diesem Fall mehrere framesbasierte Lösungen nicht. Es geht speziell um Bilder, nicht um Videos.
Würden nicht unscharfe Bilder das implizieren a) Kanten sind verschwommen, so dass jeder farbverlaufsbasierte Operator im Vergleich zur Leuchtdichte im Bild niedrige Werte hat b) Kanten sind unscharf, so dass jeder krümmungsbasierte Operator niedrige Werte hat c) für wackelige Bilder werden die Pixel mit anderen Pixeln in der Richtung des Shakes (einer Translation oder einer Rotation) korreliert
Ich habe dein Bild in Gimp gemacht, Sobel für a) und Laplacian für b) (verfügbar in openCV), und habe Bilder, die im obigen Teil viel dunkler sind.
Das Kalibrieren von Schwellenwerten für allgemeine Bilder wäre ziemlich schwierig, denke ich.
Haben Sie es mit einem Videostream oder einem einzelnen Bild zu tun?
Im Falle eines Videostreams : Am besten berechnen Sie die Differenz zwischen jeweils zwei benachbarten Frames. Und markieren Sie jedes Pixel mit Differenz. Wenn die Anzahl solcher Pixel niedrig ist - befinden Sie sich in einem nicht wackeligen Rahmen. Beachten Sie, dass bei dieser Methode nicht geprüft wird, ob das Bild scharf ist, sondern nur, um Bewegungsunschärfe im Bild zu vermeiden. Ihre Implementierung sollte Folgendes enthalten:
Der obige Algorithmus sollte stark genug sein (ich habe ihn in einem meiner Projekte benutzt, und es hat wie eine Magie funktioniert).
Im Falle eines einzelnen Bildes : Der obige Algorithmus löst keine unscharfen Bilder und ist für ein einzelnes Bild irrelevant.
Fokusproblem in Video :
Letzte Anmerkung: Das Problem der Fokuserkennung in einem einzelnen Bild ist sehr schwierig. Es gibt eine Menge akademischer Arbeiten (mit Fourier-Transform-Wavelets und anderen "Big algorithmic cannons"). Aber das Problem bleibt sehr schwierig, denn wenn man ein verschwommenes Bild betrachtet, kann man nicht wissen, ob die Kamera die Unschärfe mit falschem Fokus erzeugt oder ob die ursprüngliche Realität bereits verschwommen ist (z. B. weiße Wände sind sehr verschwommen, Bilder aufgenommen) in einer Dunkelheit neigen dazu, auch bei perfektem Fokus verschwommen zu sein, Bilder von Wasseroberfläche, Tischoberfläche neigen dazu, verschwommen zu sein). Jedenfalls gibt es nur wenige Threads im Stapelüberlauf bezüglich des Fokus im Bild. Wie dieses . Bitte lies sie.
Sie können auch die Fourier-Transformation des Bildes berechnen, und wenn in den Bins mit hoher Frequenz eine geringe Anhäufung vorhanden ist, ist das Bild wahrscheinlich unscharf. JTransform ist eine sinnvolle Bibliothek, die FFTs anbietet, wenn Sie diese Route hinunterfahren möchten.
Es gibt auch einen ziemlich ausführlichen Blogeintrag hier über verschiedene Methoden, die verwendet werden könnten
Es gibt auch eine weitere Stapelüberlauffrage fragt dies aber mit OpenCV , hat OpenCV auch Java-Bindings und kann in Android-Projekten verwendet werden, daher könnte diese Antwort auch hilfreich sein.
Tags und Links java android opencv image-processing