Maintenant que nous savons comment utiliser efficacement ʻImageFilter.ModeFilter`, nous allons l'utiliser pour créer un filtre semblable à une peinture. Je n'utilise pas numpy etc., seulement un oreiller.
C'est la seule source.
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)
Tout d'abord, s'il y a beaucoup de couleurs, il sera difficile de le faire ressembler à une peinture, donc il sera réduit.Pour la réduction de couleur, utilisez ʻImage.quantize`. Le nombre de couleurs peut être n'importe quel nombre, mais plus le nombre de couleurs est petit, plus la couleur est faible. Ici, la méthode kmeans est utilisée pour réduire le nombre de couleurs à huit. Pour les images avec un grand nombre de couleurs, il peut être préférable d'utiliser 16 à 32 couleurs.
qant_img = img.quantize(8, kmeans=True).convert("RGB")
ʻImageFilter.ModeFilter` n'a pas été utilisé jusqu'à présent, mais une fois appliqué, la couleur devient monotone. Puisque l'opération de convolution qui sélectionne la valeur la plus fréquente dans la fenêtre du noyau est effectuée, la zone de couleur s'agrandit.
t = qant_img.filter(ImageFilter.ModeFilter(12))
Cela devient plus comme une peinture.
Cette fois, je veux exprimer "saignement", donc j'ajouterai un flou gaussien pour le rendre à nouveau monotone. Si vous répétez "monotonisation → Flou gaussien", l'image saignera de plus en plus. Enfin, je veux le rendre un peu flou, alors j'applique légèrement un flou gaussien.
t = t.filter(ImageFilter.GaussianBlur(5))
t = t.filter(ModeFilter(12))
t = t.filter(ImageFilter.GaussianBlur(1))
Si vous voulez avoir plus de saignements, répétez davantage "flou monotone → gaussien", mais cette fois, il devrait en être question.
Enfin, créez un dessin au trait à partir de l'image d'origine, l'algorithme était basé sur ici. Bien que cette méthode soit simple, elle est recommandée car elle permet de générer de très beaux dessins au trait.
gray = img.convert("L")
gray2 = gray.filter(ImageFilter.MaxFilter(5))
line_inv = ImageChops.difference(gray, gray2)
line_img = ImageOps.invert(line_inv).convert("RGB")
Enfin, combinez ces deux pour terminer.
ImageChops.multiply(color_img, line_img)
Si vous ajustez un peu plus les paramètres, vous pourrez peut-être les exprimer plus magnifiquement. ʻImageFilter.ModeFilter` et Gaussian Blur provoqueront des "saignements", donc je pense qu'il peut être utilisé pour quelque chose.
Après tout, l'ajustement des paramètres est nécessaire, et si la valeur de ʻImageFilter.ModeFilter` est fixée à environ 5, "bleeding" sera adouci.