Bildkontrast ermitteln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich verwende ein Python-Script, um das Aufnahme-Datum eines Bildes mit PIL in das Bild zu schreiben. Damit der Text gut lesbar ist, wähle ich die Textfarbe so aus, dass die Helligkeit in dem Bereich, in dem der Text ausgegeben wird, sich um ein Mindestmaß ändert. Das funktioniert meistens auch ganz gut. Wenn der Hintergrund aber sehr unruhig ist, sind manchmal Teile des Textes nicht gut zu lesen. Gibt es evtl. professionellere Methoden, um den Kontrast eines Bildbereiches zu ermitteln?
Danke
HWK
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Eine andere möglichkeit wäre deine z.B. immer schwarze Schrift mit einem weissen Rahmen zu versehen. Weiss zwar nicht wie das am schönsten geht aber dann wäre die Schrift immer lesbar.

Gruss
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Das wäre wohl eine einfache Möglichkeit. Ob das schön aussieht, ist aber Geschmackssache. Zum anderen würde es mich einfach interessieren, ob es Möglichkeiten gibt, die Lesbarkeit (am ehesten also wohl den Kontrast) der Schrift zu ermitteln. Filter in Bildbearbeitungsprogrammen machen da ja sehr viel (sharpen etc.). Vielleicht könnte man ja ähnliche Algorithmen für mein Problem verwenden. Ich habe aber keine Ahnung, wie so etwas aussehen könnte, und schon gar nicht, ob so etwas in Python vom Tempo her möglich wäre.
rayo, trotzdem danke für Deine superschnelle Antwort.
MfG
HWK
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Die Performance sollte kein Problem sein, im Zweifelsfall benutzt du direkt über Cython die C-Bindings falls es nun echt arg langsam wird ;)

Und zum Kontrast fällt mir grad allerdings auch nichts ein an netten Bindings...und der Algo selbst, der mir im Kopf schwebt ist wirklich sehr BruteForce :D

grad gefunden:
var

stat.var

(Attribute). Variance.
http://www.pythonware.com/library/pil/h ... gestat.htm

Das soltle es doch ungefähr sein, oder?

Alternativ:
difference

ImageChops.difference(image1, image2) => image

Returns the absolute value of the difference between the two images.

out = abs(image1 - image2)
http://www.pythonware.com/library/pil/h ... echops.htm

Und das Bild eben in kleine Bilderchen einteilen.

Oder du zeichnest die Schrift einfach immer als invertierte Orginalfarbe des Pixels :D
BlackJack

Der letzte Vorschlag hat so seine Tücken. Je nach dem wie man's implementiert, gibt's fast immer irgendwelche invertierten Farben, die sehr nah an der nicht-invertierten Farbe sind. Einfaches invertieren der Bits auf Grauwerten zum Beispiel, ergibt wieder Grauwerte, bei einem "mittleren" Grau dann einen, der nur um 1 im Wert in jeder RGB-Komponente abweicht. Mit anderen Worten "Geheimschrift". :-)

Also ich persönlich würde schwarze oder weisse Schrift mit entsprechend gegensätzlicher schwarzen oder weissen Umrandung bevorzugen, als einen Algorithmus, der "unvorhersehbare" bunten Schriftzüge erstellt.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Gute Lesbarkeit bekommst du immer mit schwarzer Schrift auf weißem Hintergrund. Deshalb sind alle Bücher und Zeitungen so gedruckt. Man nennt es auch Positivdarstellung.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Vielen Dank für die Vorschläge:
Schwarze Schrift auf einem weißen Hintergrund oder mit weißem Rand in das Bild einzubinden, ist sicher das einfachste. Schöner finde ich persönlich aber eine Schrift ohne Rand. Meine Methode, die die Helligkeit der Schrift an die Helligkeit des Hintergrundes anpasst, liefert in der Mehrzahl der Fälle ja ausreichend gute Ergebniss. Probleme gibt es aber bei unregelmäßigem Hintergrund (abwechselnd helle und dunkle Anteile). Hier würde mich halt interessieren, ob es irgendwelche Algorithmen gibt, die den "Kontrast" eines Bildes ermitteln können. Beim Googlen fand ich den Vorschlag, lieber Graustufen als Farben zur Berechnung zu verwenden. Am Ergebnis hat dies aber nichts verändert.
difference hatte ich bereits selbst probiert. Es hilft aber nicht weiter, da der Rand immer zu Null wird.
audax' anderer Vorschlag (Varianz!) hat mir nach einigem Ausprobieren aber sehr geholfen. Wenn die Varianzsumme der Kanäle um mehr als 5000 ansteigt, ist der Text auf praktisch allen Bildern gut zu lesen.
Danke
HWK

Edit @audax: Welcher Brute-Force-Algorithmus schwebte Dir denn vor?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

HWK hat geschrieben:Edit @audax: Welcher Brute-Force-Algorithmus schwebte Dir denn vor?
Im Prinzip ein Prototyp der Varianz-Funktion. Der wäre dann natürlich 'etwas' langsamer als die Varianz-Funktion aus der PIL ;)

btw:
Zeig mal den Code her, das erscheint mir doch recht praktisch und ich würd die PIL gerne mal im Einsatz sehen :]
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich hab jetzt festgestellt, dass meine alte Methode ähnliche Ergebnisse liefert, wenn ich die Helligkeitsdifferenz nur groß genug wähle. Sie ist dann aber wesentlich langsamer, ca. Faktor 2. Die Varianzmethode von PIL scheint da doch um einiges schneller zu sein als meine Methode zur Helligkeitsberechnung.
Da audax Interesse am Code zeigt, stelle ich das Script einmal ins Showcase: http://www.python-forum.de/post-91152.html#91152
MfG
HWK
Antworten