Affenscharf (Linux-Magazin, September 2009)

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.

Scharfes Original

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.

Nachträglich schärfen

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.

Unscharfe Masken

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.

Selektive Schärfung

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.

Listing 1: smartsharp

    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.

Installation

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.

Reihenfolge wichtig

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.

Infos

[1]

Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2009/09/Perl

[2]

``The Digital Photography Book'', Scott Kelby, 2006, http://www.amazon.com/dp/032147404X

[3]

``Alter geht vor Schönheit'', Michael Schilli, 2009 http://www.linux-magazin.de/heft_abo/ausgaben/2009/04/alter_geht_vor_schoenheit

[4]

``Farbenspiel'', Michael Schilli, 2008 http://www.linux-magazin.de/heft_abo/ausgaben/2008/07/farbenspiel

Michael Schilli

arbeitet 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.