[PYTHON] Rendez vos photos illustrées avec le filtre de mode d'oreiller

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.

L'image originale

mono.jpg

Après la conversion

ダウンロード (1).png

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)
2017/02/24 Il y avait une erreur dans la source, donc je l'ai corrigée

Commentaire

La décoloration

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")

ダウンロード.png

Créer une image de remplissage

ʻ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))

ダウンロード (1).png

Cela devient plus comme une peinture.

Répéter alternativement le flou gaussien et la monotonisation

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))

ダウンロード (2).png

Si vous voulez avoir plus de saignements, répétez davantage "flou monotone → gaussien", mais cette fois, il devrait en être question.

Faire un dessin au trait

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")

ダウンロード (3).png

Combiner l'image de remplissage et le dessin au trait

Enfin, combinez ces deux pour terminer.

ImageChops.multiply(color_img, line_img)

ダウンロード (4).png

Résumé

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.

ダウンロード (8).png

Recommended Posts

Rendez vos photos illustrées avec le filtre de mode d'oreiller
Créer un filtre avec un modèle django
Essayez de créer votre propre AWS-SDK avec bash
Créez rapidement votre propre module avec setuptools (python)
Créez votre propre lecteur de musique avec Bottle0.13 + jPlayer2.5!