LoginSignup
3
3

More than 5 years have passed since last update.

PIL(Python Imaging Library)で、画像をセピア調に変換する

Last updated at Posted at 2013-07-25

※自分の学習用のメモです。

なにをやりたいのか

ここでは、ピクセルの読み込みのサンプルです。

元画像のピクセルを読み込む → 加工する → 加工したデータを書き込む
といった手順になります。

具体的には、ピクセルを読み込む → グレースケールに変換 → セピア調の色合いにに変換 → ピクセルを書き込む
という処理を、ひとつづつ、全てのピクセルに行います。

より効率的な方法があることは知っています。

実行結果

元画像
haku12.png

実行結果
haku12sepia.png

スクリプト

Python 2.7で実行。まだPILはPython 3系には対応していないもよう。

image-sepia.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
画像をセピア調に変換するフィルタ

第一引数 : 入力ファイル名
第ニ引数 : 出力ファイル名(省略可)

セピアとはイカ墨から作られる黒茶色の絵の具のことで、画像をセピア調にするということは、これで描かれたように見せるということである。 
- グレイスケール化することによって輝度情報を取り出す
- 全体を茶色っぽく変換
'''
import sys
import Image

def grayscale(r,g,b):
    '''
    RGB値をグレースケール(白黒)に変換する
    '''
    # NTSC 系加重平均法
    gray = int(r * 0.298912 + g * 0.586611 + b * 0.114478)
    # 単純平均法
    #gray = int((r+g+b)/3)
    return gray

def sepiatone(r,g,b):
    '''
    RGB値をセピア調に変換する
    セピア調に変換する決まり事はないみたいなので、それっぽくなれば OK.
    '''
    gray = grayscale(r,g,b)
    #sr = int(gray * 0.9);sg = int(gray * 0.7);sb = int(gray * 0.4)
    #sr = gray; sg = int(gray * 0.8);sb = int(gray * 0.6)
    sr = int(gray * 0.8 + 2); sg = int(gray * 0.6 + 2);sb = int(gray * 0.4 + 2)
    return sr,sg,sb

def make_image(infile, outfile):
    '''
    画像をセピア調に変換する
    '''
    img = Image.open(infile)
    img = img.convert("RGB")
    x,y = img.size
    for ly in range( y):
        for lx in range( x):
            r,g,b = img.getpixel((lx, ly))
            sr,sg,sb = sepiatone(r,g,b)
            img.putpixel((lx,ly), (sr,sg,sb))
            # ↓やや色あせた感じにしたい場合
            #img.putpixel((lx,ly), ((r+sr)/2,(g+sg)/2,(b+sb)/2))
    img.save(outfile)
    return

def usage():
    sys.stderr.write("Usage: %s infile [outfile] \n" % sys.argv[0])
    return

if __name__ == '__main__':
    argvs = sys.argv
    argc = len(argvs)
    # 引数チェック
    if ((argc == 1 ) or (argc > 3)):
        usage()
        sys.exit(1)
    if (argc > 2):
        outfile = argvs[2]
    else:
        outfile = "output.png"

    infile = argvs[1]

    make_image(infile , outfile)

# EOF
3
3
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
3
3