LoginSignup
12
14

More than 5 years have passed since last update.

PillowのModeFilterを使って写真を絵画調にする

Last updated at Posted at 2017-02-23

pillowのImageFilter.ModeFilterの有効な使い方がわかったので、それを使って絵画調フィルタを作ります。
numpyなどは使いません、pillowのみです。

元画像

mono.jpg

変換後

ダウンロード (1).png

ソースはこれだけです。

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 ソースにエラーがあったので修正しました

解説

減色する

まず、色数が多いと絵画調になりにくいので減色します、減色はImage.quantizeを使います。
色数は何色でも良いのですが、色数が少ないほどベタ塗りになります、ここではkmeans法を使って8色に減色します。
色数が多い画像は、16〜32色にしたほうがいいかもしれません。

qant_img = img.quantize(8, kmeans=True).convert("RGB")

ダウンロード.png

塗り画像を作る

ImageFilter.ModeFilterは、今までいまいち使い方が不明でしたが、かけると色が単調化します。
カーネルウインドウの中の最頻値を選択する畳込み演算をするので、色の領域が広がっていきます。

t = qant_img.filter(ImageFilter.ModeFilter(12))

ダウンロード (1).png

絵画っぽくなってきましたね。

ガウシアンブラーと単調化を交互に繰り返す

今回は「にじみ」を表現したいので、更にガウシアンブラーをかけて再び単調化します。
「単調化→ガウシアンブラー」を繰り返していくと、画像がどんどんにじんでいきます。
最後に、少しぼかした感じにしたいので軽くガウシアンブラーをかけます。

t = t.filter(ImageFilter.GaussianBlur(5))
t = t.filter(ModeFilter(12))
t = t.filter(ImageFilter.GaussianBlur(1))

ダウンロード (2).png

もっとにじみを出したい場合は「単調化→ガウシアンブラー」をもっと繰り返しますが、今回はこれくらいで良いでしょう。

線画をつくる

最後に元画像から線画を作成します、アルゴリズムはこちらを参考にしました。
この方法は単純ながら、非常に綺麗な線画を生成できるのでお薦めします。

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

塗り画像と線画を合成する

最後にこの2つを合成すれば完成です。

ImageChops.multiply(color_img, line_img)

ダウンロード (4).png

まとめ

もう少しパラメータを調整すれば、もっと綺麗な表現ができるかもしれません。
ImageFilter.ModeFilterとガウシアンブラーの組み合わせで「にじみ」が出てくるので、何かと使えるかと思います。

やはり、パラメータ調整は必要でImageFilter.ModeFilterの値を5くらいにすると「にじみ」がやわらかくなります。

ダウンロード (8).png

12
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
14