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秒かかりました。処理を工夫しないと、莫大な処理時間がかかるようです。コンパイラ型の言語であれば、こんなに時間はかからないのですが…。
-
前の記事
記事がありません
-
次の記事
処理時間を計測するには 2020.03.21