freedom-_-qの勉強履歴

メモ書きが主になるかと思います。勉強強制のために一日一記事目指してます。頭良くないので間違いが多々あるかと思います。

Pythonのclickでコマンドラインツールをつくってみる

はじめに

今までコマンドラインツールはargparseを使用していたが、Clickなるものが便利っぽいので使ってみる。

基本構文

Clickは引数を追加したい関数の前でデコレーターを用いて指定する。

@click.command()
@click.argument('arg')
def main(arg):
    pass

仕様とソースコード

モザイク画像から徐々に鮮明化していくgifを画像ファイル(png, jpg)から作成する。

import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
from matplotlib.animation import PillowWriter
from PIL import Image
import numpy as np
import click
import math

@click.command()
@click.argument('input_path')
@click.argument('output_path')
@click.option('--puretime', '-p' , type=int, default=450, help='Pure image display time:[msec]')
@click.option('--noisetime', '-n', type=int, default=1500, help='noisy image display time unit:[msec]')
@click.option('--level','-l' , type=int, default=100, help='Noise level')
def main(input_path, output_path, puretime, noisetime, level):
    im = Image.open(input_path)
    im_arr = np.asarray(im, dtype='int32').copy()
    fig, ax = plt.subplots()
    artists = []
    interval = math.gcd(puretime, noisetime)

    for _ in range(int(puretime/interval)):
        artists.append([ax.imshow(im_arr)])
    
    for _ in range(int(noisetime/interval)):
        ax.axis("off")
        artists.append([ax.imshow(im_arr)])
        im_arr += np.random.randint(-level, level, im_arr.shape)

    fig.tight_layout()
    ani = ArtistAnimation(fig, artists[::-1], interval=interval)
    ani.save(output_path, writer='PillowWriter')

if __name__ == '__main__':
    main()
python .\imgnoise.py ".\hatena.jpg" ".\hatena.gif" -p 100 -n 3000 -l 255
入力画像 出力画像
f:id:freedom-_-q:20210618230110j:plain f:id:freedom-_-q:20210618230124g:plain