Pythonで画像を扱うには

Pythonで画像を扱うには

Phtonで画像を加工する処理を行いたい場合の基本を説明します。

画像を開く

画像を開くにはImageをインポートしてImage.Open関数を使います。

from PIL import Image

# 画像を開く
img = Image.open('pic.jpg')

これでimgに画像のオブジェクトが入ります。

print(img)を実行すると、画像オブジェクトが入っているのがわかります。

print(img)
# <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=1920x1280 at 0x1BBB3FBC488>

画像のピクセルデータを配列に変換

画像のピクセルデータを取得するには、numpyを使います。

from PIL import Image
import numpy as np

# ピクセルデータを変換しirに入れる
a = np.asarray(img)

配列に変換されたピクセルデータは、[高さ][幅][rgb]の3次元配列になります。

# ピクセルデータの配列サイズを確認する
print(a.shape)
# (1280, 1920, 3)

格納されている数値は0~255の値で、a[x][y][0]は赤、a[x][y][1]は緑、a[x][y][2]は青の明るさが入ります。

ただし、この方法で変換すると、読み取り専用のため値を書き換えることができません。画像処理などで値を編集したい場合は、次のように行います。

a = np.copy(np.asarray(img))

こうすることで配列のディープコピーが作成され、RGB値を編集できるようになります。

配列を画像に変換する

配列を画像に変換するには、Image.fromarrayを使用します。

img = Image.fromarray(a)

画像を保存する

画像を保存するには、Imageオブジェクトのsave関数を使います。

img.save('output.jpg')

画像の色を反転するサンプルコード

元画像

試しにこの画像を元に、色を反転して保存するプログラムを作ってみましょう。

from PIL import Image
import numpy as np

# 画像を開く
img = Image.open('input.jpg')

# 画像を書き換え可能な配列に変換
a = np.copy(np.asarray(img))

# 画像の色を反転
a = 255-a

# 配列を画像に変換
img = Image.fromarray(a)

# 反転した画像を保存
img.save('output.jpg')
出力画像

赤と緑を入れ替えるサンプルコード

from PIL import Image
import numpy as np

# 画像を開く
img = Image.open('input.jpg')

# 画像を書き換え可能な配列に変換
a = np.copy(np.asarray(img))

# 赤と緑を入れ替え
for col in a:
    for p in col:
        p[0], p[1] = p[1], p[0] #0は赤、1は緑の明るさが格納されている

# 配列を画像に変換
img = Image.fromarray(a)

# 反転した画像を保存
img.save('output.jpg')

変換後

モノクロに変換するサンプルコード

from PIL import Image
import numpy as np

# 画像を開く
img = Image.open('input.jpg')

# 画像を書き換え可能な配列に変換
a = np.copy(np.asarray(img))

# RGBの平均を計算
for col in a:
    for p in col:
        ave = np.average(p) #全色の平均値を求める
        p[:] = ave

# 配列を画像に変換
img = Image.fromarray(a)

# 反転した画像を保存
img.save('output.jpg')
変換後

モノクロ変換には約37秒かかりました。処理を工夫しないと、莫大な処理時間がかかるようです。コンパイラ型の言語であれば、こんなに時間はかからないのですが…。