Jetzt, da wir wissen, wie man den ImageFilter.ModeFilter des Kissens effektiv einsetzt, werden wir ihn verwenden, um einen malerähnlichen Filter zu erstellen. Ich benutze kein Numpy usw., nur Kissen.
Dies ist die einzige Quelle.
from PIL import Image, ImageChops, ImageOps, ImageFilter
img = Image.open("test.jpeg ")
qant_img = img.quantize(8, kmeans=True).convert("RGB")
t = qant_img
t = t.filter(ImageFilter.ModeFilter(12))
t = t.filter(ImageFilter.GaussianBlur(5))
t = t.filter(ImageFilter.ModeFilter(12))
t = t.filter(ImageFilter.GaussianBlur(1))
color_img = t.convert("RGB")
gray = img.convert("L")
gray2 = gray.filter(ImageFilter.MaxFilter(5))
line_inv = ImageChops.difference(gray, gray2)
line_img = ImageOps.invert(line_inv).convert("RGB")
ImageChops.multiply(color_img, line_img)
Wenn die Anzahl der Farben groß ist, ist es zunächst schwierig, sie wie ein Gemälde aussehen zu lassen, sodass sie reduziert wird. Verwenden Sie zur Farbreduzierung "Image.quantize". Die Anzahl der Farben kann eine beliebige Anzahl sein, aber je kleiner die Anzahl der Farben ist, desto solider ist die Farbe. Hier wird die kmeans-Methode verwendet, um die Anzahl der Farben auf acht zu reduzieren. Für Bilder mit einer großen Anzahl von Farben ist es möglicherweise besser, 16 bis 32 Farben zu verwenden.
qant_img = img.quantize(8, kmeans=True).convert("RGB")
Ich wusste bis jetzt nicht, wie man "ImageFilter.ModeFilter" verwendet, aber wenn ich es anwende, wird die Farbe eintönig. Da die Faltungsoperation ausgeführt wird, die den häufigsten Wert im Kernelfenster auswählt, wird der Farbbereich erweitert.
t = qant_img.filter(ImageFilter.ModeFilter(12))
Es wird mehr wie ein Gemälde.
Dieses Mal möchte ich "Blutung" ausdrücken, also werde ich Gaußsche Unschärfe hinzufügen, um sie wieder eintönig zu machen. Wenn Sie "Monotonisierung → Gaußsche Unschärfe" wiederholen, blutet das Bild immer mehr. Zum Schluss möchte ich, dass es etwas verschwommen aussieht, also wende ich leicht eine Gaußsche Unschärfe an.
t = t.filter(ImageFilter.GaussianBlur(5))
t = t.filter(ModeFilter(12))
t = t.filter(ImageFilter.GaussianBlur(1))
Wenn Sie mehr Blutungen bekommen möchten, wiederholen Sie "monoton → Gaußsche Unschärfe" mehr, aber diesmal sollte es darum gehen.
Erstellen Sie schließlich eine Strichzeichnung aus dem Originalbild. Der Algorithmus basierte auf hier. Obwohl diese Methode einfach ist, wird sie empfohlen, da sie sehr schöne Strichzeichnungen erzeugen kann.
gray = img.convert("L")
gray2 = gray.filter(ImageFilter.MaxFilter(5))
line_inv = ImageChops.difference(gray, gray2)
line_img = ImageOps.invert(line_inv).convert("RGB")
Kombinieren Sie diese beiden schließlich, um den Vorgang abzuschließen.
ImageChops.multiply(color_img, line_img)
Wenn Sie die Parameter etwas stärker anpassen, können Sie sie möglicherweise besser ausdrücken. Die Kombination von "ImageFilter.ModeFilter" und Gaußscher Unschärfe verursacht "Blutungen", daher denke ich, dass sie für etwas verwendet werden können.
Schließlich ist eine Parametereinstellung erforderlich, und wenn der Wert von "ImageFilter.ModeFilter" auf etwa 5 eingestellt ist, wird "Ausbluten" gemildert.
Recommended Posts