読者です 読者をやめる 読者になる 読者になる

pythonとPillowで画像処理

pythonで画像処理をするためのライブラリ”Pillow”について少し調べたのでまとめました。

パッケージのインストール

pip install pillowでインストールできます。anacondaをお使いの方はデフォルトでインストールされています。

画像を読み込む

既存の画像から読み込む場合はImage.open(path)、プログラム上で新たに画像を作る場合はImage.new((width, height))と記述します。

ピクセルを操作する

image.getpixel(xy)(r, g, b, a)のようにタプルで座標xyのピクセルの情報が返され、image.putpixel(xy, color)で座標xyのピクセルを置き換えることができます。とりあえずグレイスケールに変換して表示するスクリプトを書いてみましょう。グレイスケール化はとても簡単で、あるピクセルのグレイスケール化した際の値は、0.299R+0.187G+0.114Bと定義されます。またimage.show()で画像を表示することができます。

from PIL import Image

image = Image.open("lena.png").convert("RGBA")

for y in range(image.size[1]):
    for x in range(image.size[0]):
        xy = (x, y)
        p = image.getpixel(xy)
        Y = int(p[0] * 0.299 + p[1] * 0.587 + p[2] * 0.114)
        g = (Y, Y, Y, p[3])
        image.putpixel(xy, g)

image.show()

f:id:usiatan2:20170327124050p:plain
モノクロになりました。

保存する

image.save(path)で保存できます。いろいろとオプションがありますが、今回は割愛します。

図形を描き込む

ImageDraw.Draw(image)が返すImageDrawクラスを操作することで線や多角形をimageに描き込むことができます。以下のコードは縦横100ピクセルの画像に三角形を描きこんでいます

image = Image.new("RGBA", (100, 100))
draw = ImageDraw.Draw(image)
draw.polygon([(50, 0), (0, 100), (100, 100)], fill=(255, 255, 255, 255))

遊んでみる

レナさんをランダムウォークのような軌跡で切り取ってみました。

import math
import random
from PIL import Image, ImageDraw

i1 = Image.open("lena.png").convert("RGBA")
w = i1.size[0]
h = i1.size[1]

i2 = Image.new("RGBA", (w, h))

draw = ImageDraw.Draw(i2)
x = w / 2
y = h / 2
for i in range(50000):
    px = x
    py = y
    while True:
        angle = random.random() * math.pi * 2
        nx = x + math.cos(angle) * 5
        ny = y + math.sin(angle) * 5
        if 0 <= nx < w and 0 <= ny < h:
            x = nx
            y = ny
            break
    draw.line([(int(px), int(py)), (int(x), int(y))],  fill=(0, 0, 0, 255))

i3 = Image.new("RGBA", (w, h))

for y in range(h):
    for x in range(w):
        xy = (x, y)
        p1 = i1.getpixel(xy)
        p2 = i2.getpixel(xy)
        color = (p1[0], p1[1], p1[2], p2[3])
        i3.putpixel(xy, color)

i3.save("lena_.png")

f:id:usiatan2:20170326234553p:plain

まとめ

他にもブレンドやフィルター、ピクセルの統計情報などさまざまな機能が実装されています。公式サイトがかなり充実しているので参考にしましょう。