Unglücklicherweise gibt es im Gegensatz zu Ihrer vorherigen Frage zu Symbolen viele Möglichkeiten, die Hintergrundentfernung mit komplexeren Bildern zu erreichen. Daher gibt es möglicherweise keine "gute" Lösung. Für das von Ihnen gepostete Beispiel sind hier einige Ansätze, die möglicherweise zufriedenstellender sind.
Obwohl ich unten meine Vorschläge gebe, gibt es wahrscheinlich viel bessere Möglichkeiten, Dinge zu tun, von denen ich derzeit nichts weiß. Bitte verzeihen Sie Fehler, Auslassungen oder Dinge, die ich übersehen habe. =)
Einfache einfarbige Transparenz
Um eine einzelne Farbe (z. B. Hintergrund) in transparent umzuwandeln, können Sie Folgendes verwenden:
convert fox.jpg -transparent white fox_transparent.png
Dies führt jedoch zu den gleichen Ergebnissen wie Ihr schlechtes Bild, was unerwünscht ist:
Ex. fox_transparent
Dies ist darauf zurückzuführen, dass die Bereiche in Weiß (oben) nicht wirklich weiß sind (sie sind weißlich, hauptsächlich aufgrund von Anti-Aliasing, wie Sie bemerkt haben). Um dies zu beheben, können Sie mit -fuzz fast (fast) weiße Pixel auswählen :
convert fox.jpg -fuzz 11% -transparent white fox_transparent_fuzzed.png
Dies führt zu besseren Ergebnissen:
Ex. fox_transparent_fuzzed
Bessere Kanten (?)
Eine einfache Verwendung von -fuzz
kann zwar gut funktionieren, kann jedoch unerwünschte Rauheiten aufweisen:
Ex. fox_transparent_fuzzed - Ecken und Kanten
Um dieses Problem zu beheben, können Sie eine verwischte Maske verwenden, um die Kanten des Bildes weicher zu gestalten. Um dies in einem Schritt zu tun, können wir etwas Code aus diesem Forumbeitrag entnehmen und wie folgt verwenden:
convert fox.jpg ( -clone 0 -fuzz 11% -transparent white -blur 0x1 ) -compose copy_opacity -composite fox_transparent_fuzzed_blurry_mask.png
Dieser Befehl erstellt eine unscharfe Maske, die dann mit dem Originalbild zusammengesetzt wird. Das ist das Ergebnis:
Ex. fox_transparent_fuzzed_blurry_mask
Sie können sehen, dass die Kanten jetzt weicher sind:
Bei Bedarf können wir etwas Ähnliches in zwei Schritten machen:
convert fox.jpg -type Grayscale -negate -fill white -fuzz 11% +opaque "#000000" -blur 0x1 fox_blur_mask.jpg convert fox.jpg fox_blur_mask.jpg -compose copy_opacity -composite fox_transparent_blur_mask_result.png
Der erste Befehl:
Erstellt eine Schwarzweißversion des Bildes (
-type Grayscale
).Invertiert (effektiv) die Farben für Maskierungszwecke ( -negate ).
Verwendet
-fill white -fuzz 11% +opaque "#000000"
, um den Kopf des Fuchses mit Weiß zu füllen (damit wir den Großteil des Originalbildes sehen können).Fügt
-blur 0x1
dem Bild ein Licht hinzu .
Dies ist die erzeugte Maske, wobei im endgültigen Bild alles in Schwarz transparent wird:
Ex. fox_blur_mask
Der zweite Befehl kombiniert einfach das Originalbild und die Maske, um dieses Ergebnis zu erhalten:
Ex. fox_transparent_blur_mask_result
Sie werden feststellen, dass das Ergebnis fast identisch mit dem zuvor angegebenen Beispiel ist:
Vorsichtsmaßnahmen
Wie bereits erwähnt, sind die Vorschläge nicht die einzigen Möglichkeiten, Dinge zu erreichen, und es gibt möglicherweise alternative / bessere Versionen der Befehle.
In diesen Beispielen wird davon ausgegangen, dass das Originalbild nicht transparent ist. In diesem Fall müssen Sie möglicherweise andere Optionen / Befehle verwenden. Ebenso wurden diese Vorschläge nur mit .jpg-Dateien als Eingabeformat und .png-Dateien als Ausgabeformat getestet.
Der grundlegende Nachteil
-fuzz
ist, dass eine konsistente Anwendung schwierig ist.-fuzz 11%
funktioniert am besten für das Beispielbild.-fuzz 10%
oderfuzz 12%
würde wahrscheinlich unerwünschte Streupixel zurücklassen. Andere-fuzz
Werte werden wahrscheinlich für andere Bilder benötigt.Diese Vorschläge beziehen sich nicht auf Ansätze, um bestimmte Teile eines Bildes beizubehalten, die dieselbe Farbe wie der Hintergrund haben (z. B. die weißen Augen des Fuchses). Dazu möchten Sie wahrscheinlich entweder A) die Maske im letzten Beispiel ändern oder B) wenn Sie etwas wie das zweite Beispiel von oben wünschen, verwenden Sie z
convert fox.jpg -bordercolor white -border 1x1 -fuzz 11% -fill none -floodfill +0+0 white -shave 1x1 fox_flood_2_minimal.png
Beachten Sie, dass der obige Befehl aus dem bereits bereitgestellten Maskierungslink kopiert wurde .