Normalisieren Histogramm (Helligkeit und Kontrast) einer Reihe von Bildern mit Python Image Library (PIL)

8

Ich habe ein Skript, das mithilfe der Google Maps-API eine Sequenz von gleich großen quadratischen Satellitenbildern herunterlädt und eine PDF-Datei generiert. Die Bilder müssen vorher gedreht werden, und das mache ich bereits mit PIL.

Ich habe festgestellt, dass aufgrund der unterschiedlichen Licht- und Geländebedingungen einige Bilder zu hell sind, andere zu dunkel, und das resultierende PDF endet etwas hässlich, mit weniger als idealen Lesebedingungen "im Feld" ( Das ist Backcountry Mountain Biking, wo ich eine gedruckte Thumbnail von bestimmten Kreuzungen haben möchte.

(EDIT) Das Ziel besteht dann darin, alle Bilder mit ähnlicher scheinbarer Helligkeit und Kontrast erscheinen zu lassen. Die Bilder, die zu hell sind, müssten also abgedunkelt werden, und die dunklen müssten erleuchtet werden. (Ich habe übrigens imagemagick autocontrast , oder auto-gamma , oder equalize , oder autolevel , oder so ähnlich, mit interessanten Ergebnissen in medizinischen Bildern verwendet, aber ich weiß nicht, wie ich das machen soll diese in PIL).

Ich habe bereits einige Bildkorrekturen nach der Konvertierung in Graustufen verwendet (hatte vor einiger Zeit einen Graustufendrucker), aber die Ergebnisse waren auch nicht gut. Hier ist mein Graustufencode:

%Vor%

Dieser Code funktioniert unabhängig für jedes Bild. Ich frage mich, ob es besser wäre, zuerst alle Bilder zu analysieren und dann ihre visuellen Eigenschaften (Kontrast, Helligkeit, Gamma usw.) zu "normalisieren".

Ich denke auch, dass es notwendig wäre, eine Analyse im Bild (Histogramm?) durchzuführen, um eine benutzerdefinierte Korrektur in Abhängigkeit von jedem Bild anzuwenden, und nicht eine gleichwertige Korrektur für alle (obwohl jede "Verbesserung" Funktion berücksichtigt implizit Anfangskonti).

Hat jemand solch ein Problem und / oder eine gute Alternative, dies mit den farbigen Bildern (keine Graustufen) zu tun?

Jede Hilfe wird geschätzt, danke fürs Lesen!

    
heltonbiker 19.08.2011, 01:45
quelle

2 Antworten

4

Was Sie wahrscheinlich suchen, ist ein Dienstprogramm, das "Histogramm-Stretching" ausführt. Hier ist eine Implementierung . Ich bin mir sicher, dass es andere gibt. Ich denke, dass Sie den ursprünglichen Farbton erhalten und diese Funktion gleichmäßig über alle Farbbänder anwenden möchten.

Natürlich besteht eine gute Chance, dass einige der Kacheln eine deutliche Diskontinuität in der Ebene aufweisen, an der sie sich anschließen. Dies zu vermeiden würde jedoch eine räumliche Interpolation der "Streck" -Parameter beinhalten und ist eine viel kompliziertere Lösung. (... wäre aber eine gute Übung, wenn diese Notwendigkeit besteht.)

Bearbeiten:

Hier ist eine Optimierung, die den Bildfarbton beibehält:

%Vor%     
Paul 24.08.2011, 03:11
quelle
1

Der folgende Code funktioniert mit Bildern von einem Mikroskop (die ähnlich sind), um sie vor dem Nähen vorzubereiten. Ich benutzte es auf einem Test-Set von 20 Bildern mit vernünftigen Ergebnissen.

Die Helligkeitsdurchschnittsfunktion stammt aus einer anderen Stackoverflow-Frage .

%Vor%

An diesem Punkt werden die "Korrektur" -Werte (d. h. die Differenz zwischen Wert und Mittelwert) in deltaList gespeichert. Der folgende Abschnitt wendet diese Korrektur nacheinander auf alle Bilder an.

%Vor%     
essbee 01.07.2016 05:59
quelle