Was macht eigentlich ein digitales Bild scharf? Eine kurze Erklärung der Prinzipien und ein Perl-Plugin für den Gimp helfen dem digitalen Hobbyfotografen, Schnappschüsse professionell aufzupolieren.
Inspiziert ein Betrachter eine Fotografie, ist es offensichtlich ob diese scharf ist oder unscharf. Doch was ist das eigentlich, Schärfe? Ein scharfes Bild weist zackige Übergänge von Hell nach Dunkel auf. Eine schwarze Linie von einigen Pixeln Breite auf weißem Grund ist der Gipfel der Schärfe. Weicht man den Übergang von Schwarz nach Weiß hingegen auf, indem man von Schwarz über Dunkelgrau nach Hellgrau nach Weiß wechselt, erscheint die Linie nicht mehr scharf sondern unscharf. Schärfe bedeutet also, dass Hell-Dunkel-Übergänge in einem Bild auf möglichst kleinem Raum und möglichst kontrastreich passieren.
Wer scharfe digitale Bilder möchte, kann schon beim Fotografieren wertvollen Vorsprung gewinnen: Starkes, direktes Sonnenlicht erzeugt kontrastreichere Konturen als ein bedeckter Himmel, der Übergänge sanfter erscheinen lässt. Viel Licht gestattet auch niedrige ISO-Einstellungen an der Kamera, denn bei hohen ISO-Werten liefert der Sensor verrauschte Bilder, die neben störender Körnigkeit den Eindruck von Unschärfe vermitteln. Auch hilft es, die richtigen Bildteile scharfzustellen: Der Teil, auf den der Betrachter als erstes sieht, sollte scharf sein, andere Teile sind nebensächlich und können ruhig etwas verschwimmen, ohne dass der Eindruck eines unscharfen Bildes entsteht. Sind bei einem Portrait zum Beispiel die Augen scharf, stört eine leicht unscharfe Nase kaum. Schärfe an den falschen Stellen ist oft auch ungewollt: Besonders die Damenwelt legt keinerlei Wert darauf, Details zerfurchter Gesichtshaut abzulichten. Hier wird stattdessen Unschärfe gewünscht: Niemals in der prallen Sonne fotografieren, sondern immer ein schattiges Plätzchen suchen. Sanfte Übergänge und wenig Kontrast ist hier gefragt, und nachträgliches Schärfen allenfalls in den Augen- und Mundpartien denkbar.
Abbildung 1: Das Originalbild: Die Saitenaufhängung einer Gitarre. Wegen zu großer Blendenöffnung haben sich Unschärfen eingeschlichen. |
Wer mit einer teureren digitalen Spiegelreflexkamera schon einmal im RAW-Format geschossen hat, schätzt die Vorzüge dieses verlustlosen Speicherverfahrens. Der Schärfeunterschied tritt besonders dann zutage, wenn man nicht das Gesamtbild sondern nur einen Ausschnitt getrennt bearbeitet, dann lässt das JPEG-Format in den feinen Details schwer zu wünschen übrig.
Eine elegante Methode, aus einer Serie von gleichartigen Schnappschüssen den schärfsten herauszufinden, ist übrigens, auf die Dateigrößen zu achten. Weil scharfe, detaillierte Übergänge schwerer zu komprimieren sind als verwaschene Szenen, sind nehmen schärfere JPG-Bilder im allgemeinen mehr Speicherplatz in Anspruch. Die größte Datei aus einer Serie enthält meist das schärfste Bild.
Um Bildteile schärfer hervortreten zu lassen, eignet sich Gimps ``Sharpen''-Funktion, die unter dem Menüpunkt Filters->Enhance->Sharpen erreichbar ist. Besonders nach dem Verkleinern eines Bildes fürs Web verliert es oft an Schärfe und es sieht kontrastarm und verwaschen aus. Der Regler in Gimps ``Sharpen''-Menü bewegt sich von 0 bis 100, die Werte 20-40 erzielen üblicherweise die besten Resultate. Sie verkürzen die Farb- und Helligkeitsübergänge an kontrastreichen Bildstellen, und vermeiden zuviel Rauschen oder unnatürlich oder ``digital'' aussehende Helligkeitssprünge, die bei zu hohen Sharpen-Werten auftreten.
Abbildung 2: Aufruf des Gimp-Filters "Sharpen" mit dem Wert 38. |
Abbildung 3: Mit dem "Sharpen"-Filter und dem eingestellten Wert 40 kommen kontrastreiche Linien schärfer hervor. |
Alle Schärfungsmethoden arbeiten nach dem selben Prinzip: Ein Algorithmus spürt Kanten und Ecken im Bild auf, verkürzt deren Hell-Dunkel-Übergänge und betont sie eventuell noch, indem er die hellen Seiten heller und die dunklen dunkler macht. Das Aufspüren von Ecken und Kanten ist wichtig, denn flächendeckendes Schärfen führt zu unnatürlichen Holperstrecken in langsamen tonalen Übergängen wie zum Beispiel auf der Gesichtshaut von abgelichteten Personen.
Wer ganz genau hinsieht, bemerkt in Abbildung 1 eine künstlich eingesetzte senkrechte rote Linie in der linken unteren Bildhälfte. Die Helligkeitswerte der Pixel dieser Teststrecke stellt Abbildung 4 vor und nach der Schärfung dar. Der Kurvenverlauf im Original ist grün, die geschärften Pixel sind rot dargestellt. Gimps ``Sharpen'' hat den Übergang von Hell nach Dunkel offensichtlich pointierter gestaltet, statt eines flachen Sattels ist nun ein spitzer Umkehrpunkt im Graphen sichtbar.
Abbildung 4: Das mit "Sharpen" geschärfte Bild weist zackigere Übergänge von Hell nach Dunkel auf. |
Das Verfahren ``Unsharp Mask'' geht noch einen Schritt weiter: Es findet Übergänge und macht deren dunkle Seiten dunkler und die hellen heller. So überhöht es die Farb- oder Helligkeitsänderung an Kanten und Ecken künstlich und erzeugt den Eindruck besserer Schärfe. Der wahre Vorteil des Verfahrens liegt allerdings in der Möglichkeit, an drei verschiedenen Parameterknöpfen zu drehen, um die Effektstärke einzustellen.
Abbildung 5: Aufruf des Gimp-Filters "Unsharp Mask". |
Abbildung 6: Nach der Anwendung einer "Unsharp Mask" mit den Werten Radius 3, Amount 0.65 und Threshold 2: Kontraste treten noch deutlicher hervor. |
Abbildung 5 zeigt den Gimp-Dialog mit den veränderbaren Werten Amount, Radius und Threshold. Der ``Amount''-Wert gibt die anteilsmäßige Kontrastverbesserung an. Zum Beispiel bestimmt 0.5, dass die Helligkeit an einer Kante auf der dunklen Seite um 50% reduziert und auf der hellen um 50% erhöht wird. Ein ``Radius''-Wert von 1 oder mehr weitet den Einfluss des Filters auf die Pixel in der Umgebung aus. Stellt man 0 ein, wirkt das Resultat unnatürlich und digital, bei Werten größer als 2 können wertvolle Bilddetails verloren gehen, denn Gimp appliziert normalverteiltes Rauschen, um die Ausweitungs des Effekts zu errechnen.
Der Wert für den ``Threshold'' legt fest, auf welche Bildteile Gimp den Filter überhaupt anwendet. Hierzu erzeugt Gimp intern eine unscharfe Kopie des Bildes und vergleicht dieses pixelweise mit dem Original. Weichen beide Pixel mehr als den Threshold-Wert von einander ab, wirft Gimp den Filter an und verbessert den Kontrast zu benachbarten Pixeln. Andernfalls belässt es die Pixel im Originalzustand. Hohe ``Threshold''-Werte beschränken die Wirkung des Filters demnach auf wenige Bildstellen mit hohen Kontrastschwankungen, während ein ``Threshold'' von 0 das gesamte Bild schärft, was allerdings meist zu erhöhtem Rauschen und unnatürlichen treppenartigem Geholper in langsamen und sanften Übergängen im Original wie Himmelsfarben oder Hauttönen führt. Besonders mit dem ``Amount''-Wert sollte man geizen, denn 1 entspricht schon einer Übersteuerung von 100%.
Der Graph in Abbildung 7 zeigt die rote Pixelstrecke in Abbildung 1 vor und nach dem Aufruf der Unsharp Mask mit zwei verschieden starken Parametersätzen. Der grüne Graph stellt die Helligkeit der Originalpixel dar. Nach einer Unsharp Mask mit dem Amount-Wert 65% ergibt sich die orange Linie, die deutlich die Übersteuerung des Hell-Dunkelkontrasts an den Kanten aufzeigt. Die rote Linie schließlich übertreibt den Effekt mit einem Amount-Wert von 150% und führt zu einem ``überscharfen'' Bild wie in Abbildung 8.
Abbildung 7: Die "Unsharp Mask" überhöht die Übergänge künstlich, indem sie deren helle Seite heller und deren dunkle Seite dunkler macht. Grün: Original, Orange: Unsharp Mask 3/0.65/2, Rot: 3/1.5/2 |
Abbildung 8: Wer's übertreibt, bekommt störende Artefakte: Unsharp Mask mit Radius 3, Amount 1.5, Threshold 2. |
Verschiedene Motive verlangen unterschiedliche Einstellungen der Unsharp Mask. So empfiehlt der große Foto-Zampano Scott Kelby in [2], Portraits mit Radius 1, Amount 1.5 und Threshold 10 zu bearbeiten. Der hohe Threshold greift dabei nur Bereiche an, in denen eh schon hohe Kontraständerungen vorherrschen. Glatte Pfirsichhaut hingegen bleibt unberührt. Für urbane Strukturen wie Gebäude hingegen empfiehlt er R=3, A=0.65, T=2. Alles andere fällt bei ihm in die Kategorie R=1, A=0.85, T=4. Diese Werte verstehen sich jedoch lediglich als Startpunkt für weitergehende Experimente, zumal Herr Kelby von Photoshop und nicht Gimp spricht, und optimale Schärfe auch stark von persönlichen Vorlieben abhängt. Die ``Unsharp Mask'' im Gimp-Vorbild ``Photoshop'' erzielt allerdings ähnliche Ergebnisse mit den gleichen Werten, wie Abbildung 9 zeigt. Photoshop CS3 kommt noch dazu mit neuen revolutionären Bordmitteln wie ``Smart Sharpen'' daher, deren Algorithmen jedoch nicht offenliegen.
Abbildung 9: Photoshop macht's ähnlich: Ein mit den Einstellungen Radius 3, Amount 65%, Threshold 2 mit Photoshops "Unsharp mask" geschärftes Bild. |
Besteht ein Bild aus verschieden scharfen Teilen, ist es meist nicht ratsam, das gesamte Bild einer Schärfung zu unterwerfen, da die relativ hohe Übersteuerung, die notwendig ist, um die unscharfen Stellen zu schärfen, zu Artefakten (dem sogenannten ``Halo'', einem ``Heiligenschein'') in den schon relativ scharfen Stellen führt. In diesem Fall bietet Gimp eine selektive Schärfung an, die sich mit Skriptmitteln allerdings nicht so einfach realisieren lässt, da der Benutzer bestimmen muss, was schärfer und was weniger scharf wird.
Zur Automatisierung bietet sich allerdings eine Filtertechnik an: Siebt
ein Hochpass Bildelemente mit stark wechselnden Hell-Dunkel-Übergängen
aus, kann eine nachfolgende Unsharp Mask sich auf diese Bildteile
konzentrieren und den Rest des Bildes ungeschärft lassen. Das Gimp-Skript
in Listing smartsharp
implementiert ein Schärfungsverfahren der Marke
Eigenbau.
Es erzeugt in Zeile 16 einen Menüeintrag ganz unten in Gimps
Image-Dialog, der aufpoppt, wenn der Benutzer in einem Bild die
rechte Maustaste drückt (Abbildung 10).
Abbildung 10: Der neue Menüpunkt "Smartsharp" taucht am Ende von Gimps Image-Kontext auf. |
01 #!/usr/bin/perl 02 use warnings; 03 use strict; 04 05 use Gimp qw(:auto); 06 use Gimp::Fu; 07 use Log::Log4perl qw(:easy); 08 09 register( 10 "perl_fu_smartsharp", # Name 11 "Sharpen an Image", # Explain 12 "It's easy!", # Help 13 "Mike Schilli", # Author 14 "GPL", # Copyright 15 "2009/06/30", # Date 16 "<Image>/Smartsharp",# Menu 17 "*", # Images accepted 18 [], 19 \&smartsharp # Function 20 ); 21 22 exit main(); 23 24 ########################################### 25 sub smartsharp { 26 ########################################### 27 my($img) = @_; 28 29 my $layer = 30 $img->image_get_active_layer(); 31 32 # Create a copy to sharpen 33 my $sharp_layer = $layer->layer_copy(0); 34 $sharp_layer->layer_set_mode( 35 OVERLAY_MODE); 36 $sharp_layer->drawable_set_name("sharp"); 37 $img->image_add_layer($sharp_layer, -1); 38 39 $img->plug_in_unsharp_mask($sharp_layer, 40 1, 1.0, 0); 41 # Create a mask layer 42 my $mask_layer = $layer->layer_copy(0); 43 $mask_layer->layer_set_mode( 44 OVERLAY_MODE); 45 $img->image_add_layer($mask_layer, -1); 46 $mask_layer->drawable_set_name("mask"); 47 48 # High Pass Filter, blur result 49 $img->plug_in_neon($mask_layer, 50 10.0, .1); 51 $img->plug_in_gauss_iir($mask_layer, 52 20.0, 1, 1); 53 54 # Add mask layer as mask to sharp layer 55 my $sharp_mask = 56 $sharp_layer->layer_create_mask(0); 57 $sharp_layer->layer_add_mask( 58 $sharp_mask ); 59 $mask_layer->edit_copy(); 60 my $float = $sharp_mask->edit_paste(0); 61 $float->floating_sel_anchor(); 62 63 # Clean up 64 $img->image_remove_layer($mask_layer); 65 $img->image_merge_down($sharp_layer, 0); 66 return $img; 67 }
Das exit main()
in Zeile 22 ist ein Artefakt der Gimp-API und wurde
in früheren Gimp-Artikeln dieser Reihe ([3], [4]) schon einmal erklärt.
Die Funktion smartsharp
ab Zeile 25 erledigt die eigentliche Arbeit
und holt in Zeile 30 zunächst eine Referenz auf den aktiven Layer des
gegenwärtig bearbeiteten Bildes. Die Schärfung findet anschließend nicht im
Original sondern in einer Layer-Kopie statt, auf die die Variable
$sharp_layer
verweist. Hierzu kopiert die Methode layer_copy()
den gerade aktiven Layer in einen neuen, der allerdings erst mit
dem Aufruf von image_add_layer()
im Layer-Dialog erscheint. Den
Überlagerungsmodus des neuen Layers setzt Zeile 35 auf OVERLAY_MODE.
Die Funktion plug_in_unsharp_mask
in Zeile 39 führt auf der
sharp
benannten Layer-Kopie eine Unsharp-Mask-Transformation
mit den Parametern Radius 1, Amount 1.0 und Threshold 0, also
flächendeckend, durch. Schließlich soll nicht Gimps
Unsharp-Mask-Algorithmus die Anwendungsbereiche der Schärfung
bestimmen, sondern eine Hochpass-Maske.
Abbildung 11: Ein Hochpass filtered kantige Bildbereiche aus, ein Rausgenerator weitet die gefundenen Bereiche aus und schmiert das Ergebnis glatt. Es dient später als Layer Mask. |
Diese erzeugt Zeile 42 zunächst in einem neuen, temporären Layer,
den Zeile 46 mit ``mask'' beschriftet. Die Variable $mask_layer
hält eine Referenz darauf. Anschließend filtert die Methode
plug_in_neon
, einem Edge-Detector,
mit einem Radius von 10 und einer Effektverstärkung
von 0.1 die Bildanteile heraus, in denen starke
örtliche Hell-Dunkelschwankungen vorherrschen. Die nachfolgend aufgerufene
Methode plug_in_gauss_irr()
weitet das Filterresultat mit einem
Gaußschen Rauschen aus und lässt die Kanten verschwimmen, damit
die Maske später nicht ruckartig ansetzt (Abbildung 11).
Abbildung 12: Die vom Skript erzeugten Layer vor dem Aufräumen, von oben nach unten: Der temporäre "mask"-Layer, der geschärfte Layer mit applizierter Maske, der Originallayer. |
Nun müssen die Zeilen 55 bis 61 den Maskenlayer nur noch als
Layermaske des Sharp-Layers einsetzen, damit Gimp die Schärfung
nur dort appliziert, wo die Maske wahre Werte aufweist. Ein
edit_paste()
mit anschließendem floating_sel_anchor()
tut genau dies. Abbildung 12 zeigt alle zu diesem Zeitpunkt definierten
Layer. Nun ist der Masken-Layer ganz oben überflüssig und Zeile
64 kann ihn löschen. Um die beiden verbliebenen Layer, den
maskierten Sharp-Layer und das Originalbild, miteinander zu
mischen, schiebt die Methode image_merge_down
den oberen Layer
in den unteren. Als Resultat bleibt der nun modifizierte Original-Layer
übrig. Wichtig ist noch, dass die aus dem Gimp-Menü aufgerufene Funktion
smartsharp eine Referenz auf das manipulierte Image-Objekt zurückgibt,
sonst hagelt's Warnungsmeldungen im Gimp. Fertig ist das scharfe Bild
in Abbildung 13.
Abbildung 13: Das Ergebnis des hausbackenen Schärfens: Kantige Bildbereiche scharf, und weniger Artefakte auf den glatten Flächen. |
Damit Gimp das Skript smartsharp
beim Hochfahren einliest, installiert
man es mit der Kommandozeile
gimptool-2.0 --install-bin smartsharp
in Gimps Plugin-Verzeichnis. Die Utility gimptool-2.0 liefert das
Debian-Paket libgimp2.0-dev mit. Des weiteren sind noch
libgimp2.0
und libgimp-perl
zu installieren, damit Gimp Perlskripts
versteht.
Wer auch noch weitere Manipulationen am Bild vornimmt, es entweder verkleinert oder die Farben korrigiert, sollte darauf achten, dass das Scharfstellen immer als letzter Schritt in der Verarbeitungskette erfolgt. Andernfalls kommen sich die verschiedenen Verfahren in die Quere und machen unter Umständen die Schärfenverbesserung wieder rückgängig.
Aus einem unscharfen Bild lässt sich allerdings durch keine Manipulation der Welt ein scharfes Meisterwerk zaubern, Tricks wie die oben beschriebenen bleiben immer nur Stückwerk. Unscharfe Bilder enthalten weniger Information als scharfe. Es ist einfach, einem Bild Information zu entziehen, aber fehlende Information hinzuzufügen, ist etwa genauso schwer wie Zahnpasta wieder in die Tube zurückzubefördern.
Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2009/09/Perl
``The Digital Photography Book'', Scott Kelby, 2006, http://www.amazon.com/dp/032147404X
``Alter geht vor Schönheit'', Michael Schilli, 2009 http://www.linux-magazin.de/heft_abo/ausgaben/2009/04/alter_geht_vor_schoenheit
``Farbenspiel'', Michael Schilli, 2008 http://www.linux-magazin.de/heft_abo/ausgaben/2008/07/farbenspiel
Michael Schilliarbeitet als Software-Engineer bei Yahoo! in Sunnyvale, Kalifornien. Er hat "Goto Perl 5" (deutsch) und "Perl Power" (englisch) für Addison-Wesley geschrieben und ist unter mschilli@perlmeister.com zu erreichen. Seine Homepage: http://perlmeister.com. |