夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

グレスケ化スクリプトを作ってみる

庶務の引き継ぎツールにはPythonのグレスケ化スクリプト云々書いている割にそれが入っておらず、またなんかやってみるとやっぱりPhotoshopが綺麗だよ〜みたいなことを言われていたので実際どのくらいのクオリティで出来るのか試してみた。
今回参考にしたサイトは

つい最近書かれた記事だから以前には無かったと思われる情報も盛り込まれている。

実装

実装はほぼ上の記事から丸写し。
デコレータとかいうの初めて見たから最初戸惑ったけど、とりあえず庶務のグレスケ化ツールっぽく整理してみた。

from PIL import Image
from PIL import ImageOps
from itertools import product

def processImage(func):
    def wrapper(input_image):
        w, h = input_image.size
        input_pix = input_image.load()
        output_image = Image.new("L", (w, h))
        output_pix = output_image.load()
        for x, y in product(range(w), range(h)):
            output_pix[x, y] = func(input_pix[x, y])
        return output_image
    return wrapper

@processImage
def grayscale(rgb):
    r, g, b = rgb
    return (r + g + b) / 3

@processImage
def luminosity_grayscale(rgb):
    r, g, b = rgb
    return r*0.2126 + g*0.7152 + b*0.0722

if __name__ == "__main__":
#    input_image = Image.open(raw_input())
#    output_image = luminosity_grayscale(input_image)
#    output_image.save(raw_input())
    (s, e) = map(int, raw_input().split(' '))
    for i in range(s, e+1):
        input_image = Image.open(str(i) + ".jpg")   # 拡張子は適当
        output_image = luminosity_grayscale(input_image)
        output_image.save("g" + str(i) + ".jpg")    # 先頭のgで元ファイルと区別

grayscale関数とluminosity_grayscale関数の二つがあるけどこれはグレスケ化の際輝度を調節するかしないか。
なんかPILの関数にグレースケール関数がもともとあるらしいんだけどこっちの輝度調節した関数のほうが綺麗に出そうだったのでこっちを採用してみた。
O(WH)、つまりO(ピクセル数)だから100枚ぐらい1000*1000pxの画像処理したら遅くなりそうだけどまぁ…Photoshopで一枚ずつやるのに比べたら…ね。

仕様

とりあえずさっきのコードをgrayscale.pyで保存。
で、画像の名前をすべて番号一つに変更したら、たとえばそれが0.jpg〜100.jpgだとするとそこにこのスクリプト突っ込んで

$ python grayscale.py
0 100
$

で同じフォルダ内にグレスケ化された画像(g0.jpg〜g100.jpg)が出来上がる。

試してみた

とりあえずしっかりした大量の画像があるわけじゃないので一枚の画像をグレスケ化してみた。
まずbeforeがこちら
f:id:touyou1121:20120228125906j:plain
まぁ一時期僕のいろんなSNSにはってあった画像ですね。で、それをこのスクリプトでグレスケ化したのが以下
f:id:touyou1121:20121006215956j:plain
これなら普通にいいんじゃないかって思えた。

使おうかなぁ…