みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

PythonのPillowで画像処理

Pythonで画像処理をするには,opencvなどのライブラリが有名みたいですが,単純な画像処理ならばPillowというライブラリが簡単みたいなので,使い方をまとめておきます.

環境 : Python3.4.2 on Mac OS X 10.10.3

リンク

インストール

$ sudo pip3 install pillow

画像読み込み

from PIL import Image

img = Image.open("background.png")
if img.mode != "RGB":
    img = img.convert("RGB")
width, height = img.size
print(width, height)
img.show()

出力

> 850 1200
> #画像が新規ウインドウで表示される.

画像の保存

img.save("pillow-output.png")

でファイル形式までちゃんと面倒を見てくれる.

画像のピクセル処理

getpixel()とputpixel()を使う.

from PIL import Image

img = Image.open("test.jpg")
if img.mode != "RGB":
    img = img.convert("RGB")
width, height = img.size
print(width, height)
img.show()
img.save("pillow-output-1.png")

for x in range(width):
    for y in range(height):
        r, g, b = img.getpixel((x, y))
        img.putpixel((x, y), (255-g, b, r))
img.show()
img.save("pillow-output-2.png")

出力

  f:id:atsuhiro-me:20151104005458p:plain:w300

ただし,これだとPythonでforを大量に回すことになり,大きな画像の処理には向かない.高速化のためにNumpyを使う.

インストール

$ sudo pip3 install numpy

Numpyを使った画像処理

array = 255-array という部分で,Numpyですべてのピクセルの計算ができる.とても高速で簡単である.

from PIL import Image
import numpy

img = Image.open("test.jpg")
if img.mode != "RGB":
    img = img.convert("RGB")
width, height = img.size
print(width, height)
img.save("pillow-output-3.png")

array = numpy.asarray(img)
array = 255-array

res = Image.fromarray(numpy.uint8(array))
res.save("pillow-output-4.png")

出力

  f:id:atsuhiro-me:20151104005501p:plain:w300

素晴らしい.