【ネタ】画像をシンメトリーにするPythonのプログラムを書いた

題名のとおりです。

Twitterで話題のHIKAKINシンメトリーBotとかあんな感じでシンメトリー画像を自分で作りたいなぁと思ったのでシンメトリー画像ではなくシンメトリー画像を作るプログラムを作りました。

ついでにPIL(Python Image Library)のお勉強も兼ねてます。

プログラムはGistに上げました。

プログラム


解説

ネガポジ反転

def NPreverse():
    img_array = 255 - np.array(img)
    Image.fromarray(img_array).save(f'changedImage/NPreverse_{filename}.png')

img変数にはPIL.Image.Imageの画像データが入っています。

1行目でNumPyのndarray型に変換して255を引くとネガポジ反転になるそうです。(詳細はよくわかっていない)

PILのfromarray関数でndarrayをPILの型に変換してsaveします。

シンメトリー(左半分を使用)

def symmetry1():
    tmp1 = img.crop((0, 0, img.size[0] // 2, img.size[1]))
    tmp2 = ImageOps.mirror(tmp1)
    dst = Image.new('RGB', (tmp1.width + tmp2.width, tmp1.height))
    dst.paste(tmp1, (0, 0))
    dst.paste(tmp2, (tmp1.width, 0))
    dst.save(f'changedImage/symmetry1_{filename}.png')

crop関数で左半分を切り抜いてImageOps.mirror関数で切り抜いた画像の左右反転したデータを用意します。

Image.new関数で新しい画像を作成してpaste関数で貼り付けてsave関数で保存しています。

シンメトリー(右半分を使用)

def symmetry2():
    tmp2 = img.crop((img.size[0] // 2, 0, img.size[0], img.size[1]))
    tmp1 = ImageOps.mirror(tmp2)
    dst = Image.new('RGB', (tmp1.width + tmp2.width, tmp1.height))
    dst.paste(tmp1, (0, 0))
    dst.paste(tmp2, (tmp1.width, 0))
    dst.save(f'changedImage/symmetry2_{filename}.png')

crop関数で右半分を切り抜いてImageOps.mirror関数で切り抜いた画像の左右反転したデータを用意します。

Image.new関数で新しい画像を作成してpaste関数で貼り付けてsave関数で保存しています。

まとめ&次にやりたいこと

こんな感じでPythonで簡単に画像のネガポジ反転、シンメトリー画像が作成できました。

人の顔を半分にしてシンメトリー画像を作成すると結構面白い画像が出来上がるので何かを使って人の顔を認識してそこで半分にするようなプログラムを作りたいと思いました。