Wie in den anderen Antworten erwähnt, hat die Beugung zu Unschärfe geführt. Um dies zu testen, kann versucht werden, das Bild durch Dekonvolution zu schärfen, indem die Punktstreufunktion verwendet wird, die F / 29 entspricht. Für die Beugung haben wir (bis zu einer Gesamtnormalisierung)
P (s) = {J 1 [ & pgr ; rs / ( & lgr ; F )] / [ & pgr ; rs / ( & lgr ; F )]} 2
wobei J 1 die Bessel-Funktion der ersten Ordnung 1 ist ,
s die in Pixeln gemessene Entfernung im Bild ist,
r die Größe eines Pixels ist (typischerweise etwa 4,2 × 10 ^ (- 6) Meter für Erntesensoren),
λ ist die Wellenlänge des Lichts und
F die F-Zahl, in diesem Fall 29.
Dies gilt dann für monochromatisches Licht, um die Punktstreufunktion für die Farbkanäle zu approximieren, die wir über einen geeigneten Wellenlängenbereich mitteln können. Außerdem sollte man P (s) über die Fläche des durch s angegebenen Pixels integrieren.
Wenn wir auf diese Weise 3-Punkt-Spread-Funktionen für die 3 Farbkanäle kompilieren, können wir das Bild schärfen, indem wir es in einen linearen Farbraum transformieren, einen Entfaltungsalgorithmus anwenden und dann zurück in sRGB transformieren. Ich habe folgendes Ergebnis erhalten:
Das Gesicht wurde also nur anhand der Daten über die Blendenzahl und der Annahme über die Größe des Pixels deutlich geschärft. Streifenartefakte sind im dunklen Teil des Bildes sichtbar. Dies liegt an der Posterisierung nach der Umwandlung in sRGB.
Auf Wunsch füge ich weitere Details zu den verwendeten Programmen hinzu. Ich habe ImageJ und ImageMagick verwendet , ich habe auch Mathematica verwendet, um die Punktverteilungsfunktion zu berechnen, aber es kann auch in ImageJ durchgeführt werden. Zunächst erkläre ich, wie ich mit ImageJ eine Dekonvolution durchführe, wenn ich bereits über die Punktverteilungsfunktion verfüge. Um die Dekonvolution durchzuführen, müssen Sie ein Plugin für ImageJ installieren. Ich habe dieses Plugin für diesen Fall verwendet, aber es gibt auch andere Plugins, z. B. das DeconvolutionLab- Plugin.
Zuerst müssen Sie in einen linearen Farbraum konvertieren. Ich habe ImageMagick verwendet, um das unscharfe Bild (input.jpg) mit dem folgenden Befehl in einen linearen Farbraum zu konvertieren:
convert input.jpg -colorspace RGB output.tif
Dann öffnen Sie mit ImageJ die Datei output.tif. Dann wählen Sie aus den Menüoptionen "Bild", dann "Farbe" und dann "Kanäle spucken". Wählen Sie dann im Menü "Plugins" und dann "Parallel iterative Deconvolution" und dann "2d interative Deconvolution".
Sie erhalten dann das Entfaltungsfenster, Sie wählen dann das Bild aus und "PSF" bedeutet die Punktstreufunktion, dort wählen Sie die Bilddatei aus, die die Punktstreufunktion enthält. Für die Methode wähle ich "WPL", die auf dem Wiener-Filter basiert, der normalerweise für rauscharme Bilder einigermaßen gut funktioniert. Aktivieren Sie in den Optionen für WPL das Kontrollkästchen "PSF normalisieren", und ändern Sie den Wert für den Tiefpassfilter auf 0,2. Standardmäßig ist es 1. Ein niedrigerer Wert ist jedoch besser für rauscharme Bilder. wird ein weniger scharfes Bild erhalten). Die anderen Optionen, Grenze kann als reflexiv gewählt werden, Größenänderung kann auf "nächste Potenz von 2" eingestellt werden, Ausgabe kann auf 32 Bit eingestellt werden, Genauigkeit kann auf doppelt gesetzt werden. Ich habe die maximale Anzahl der Iterationen auf 15 festgelegt.
Anschließend führen Sie das Programm aus, indem Sie auf "deconvolve" klicken. Sie erhalten dann eine 32-Bit-Bilddatei als Ausgabe. Normalerweise sind die Pixelwerte ziemlich ähnlich wie im Originalbild, aber Sie können einige Pixel haben, die das Maximum für das Originalbildformat überschreiten. In diesem Fall haben wir mit 8-Bit-Bildern begonnen, aber im entfalteten Bild können Grauwerte über 255 auftreten, wodurch das gesamte Bild zu dunkel wird. Dies muss behoben werden, indem diese Pixel auf 255 gekürzt werden. Dies können Sie tun, indem Sie im Menü "Prozess" und dann "Mathematik" und dann "Max" auswählen. Der Maximalwert wird dann zum Abschneiden der Grauwerte verwendet, die diesen Wert überschreiten. Beachten Sie, dass dies für das Bild gilt, auf das Sie zuletzt geklickt haben. Sie können auch sehen, welche Datei die "aktuelle Datei" ist, indem Sie "
Sobald Sie die 3 Farbkomponenten entschlüsselt haben, können Sie sie kombinieren, indem Sie im Menü "Bild", dann "Farbe" und dann "Kanäle zusammenführen" auswählen. Sie erhalten dann ein zusammengesetztes Bild, das Sie mit dem Befehl "Stack to RGB", den Sie dort finden, in 8-Bit-RGB konvertieren können.
Speichern Sie dann das Bild, nennen wir es im.tif. Schließlich müssen Sie dies in sRGB konvertieren, dies können Sie mit ImageMagick mit dem folgenden Befehl tun:
convert im.tif -set colorspace RGB -colorspace sRGB output.tif
Die verbleibende Frage ist dann, wie die Punktverteilungsfunktion erhalten werden kann. In der Praxis hätten Sie, wenn Sie ein Bild wie das hier beschriebene aufgenommen hätten, einfach ein Bild einer Punktquelle, z. B. eines Sterns bei F / 29, und dieses Bild als Punktverteilungsfunktion verwenden können. Alternativ können Sie sich Grenzen mit hohem Kontrast ansehen und die Punktstreufunktion aus der Art und Weise extrahieren, in der sich die Grauwerte über die Grenze hinweg von einem Wert zum anderen ändern. Aber dann versuchen Sie, das Bild so gut wie möglich zu schärfen.
In diesem Fall bestand das Ziel darin, die Punktverteilungsfunktionen für den Farbkanal basierend auf den erwarteten Werten für F / 29 zu kompilieren, das Bild damit zu dekonvolvieren und zu prüfen, ob das Ergebnis so gut aussieht. Mit Mathematica habe ich einige Berechnungen durchgeführt, und mit einem solchen fortschrittlichen Computeralgebra-Programm lassen sich alle Arten von Manipulationen durchführen, einschließlich der Mittelung über ein Wellenlängenintervall und der Integration über Pixelbereiche, um die PSF realistischer zu gestalten.
Mit ImageJ können Sie jedoch auch ein neues Bild erstellen, das Sie als Punktverteilungsfunktion verwenden können. Wenn Sie auf "Datei" und dann auf "Neu" klicken, können Sie ein 32-Bit-Bild mit einer Größe von 64 x 64 erstellen, das mit Schwarz gefüllt ist. Sie können dann eine Formel für die Grauwerte programmieren, indem Sie "process", dann "Math" und dann "Macro" auswählen. Um die Punktverteilungsfunktion für diesen Fall zu erhalten, bei der es sich um die Bessel-Funktion handelt, können Sie die Tatsache verwenden, dass sie durch die ersten Begriffe der Reihenerweiterung gut beschrieben wird. Die MathWorld-Seite, auf die ich verlinkt habe, gibt Ihnen diese Reihenerweiterungen , sodass J 1 (x) 2 / x 2 mit x = π rs / ( λF ) durch eine Funktion der Form A + B s 2 + C s 4 ersetzt werden kann. Diese Annäherung wird ungültig, wenn s zu groß ist. Jetzt wissen wir, dass der PSF gegen Null tendiert, dh in einem Abstand von ungefähr 5 oder 6 Pixeln kann er auf Null gesetzt werden. Unter der Annahme, dass das Polynom bei diesen Werten noch klein ist, können Sie das Makro wie folgt schreiben:
if(d<7) v = A + B * pow(d,2) + B * pow(d,4)
Sie erstellen dann 3 Bilder, beispielsweise für Lambda = 650 nm, 500 nm und 400 nm, oder welche anderen Werte Ihrer Meinung nach für die Darstellung der Beugung in den 3 Farbkanälen geeignet sind. Sie können dann die Mittelung über einige verschiedene Wellenlängen durchführen, indem Sie Bilder für verschiedene Lambda-Werte erstellen und dann "Verarbeiten", dann "Bildrechner" und dort "Hinzufügen" auswählen. Sie können dann ein weiteres Bild zu diesem Ergebnis hinzufügen. Wenn Sie fertig sind, können Sie dividieren, um den Durchschnitt zu erhalten, indem Sie "Verarbeiten", dann "Mathematik" und dann "Dividieren" auswählen.