導入
画像処理では「Pillow の画像」と「NumPy の配列」を何度も行き来します。両者の関係と、カラー画像が持つ「チャンネル」を理解しましょう。
説明
from PIL import Image, ImageDraw, ImageFont
import numpy as np
img = Image.new("RGB", (200, 80), "white")
draw = ImageDraw.Draw(img)
draw.text((10, 20), "RGB", fill=(255, 0, 0), font=ImageFont.load_default(size=48))
arr = np.array(img) # Pillow画像 → NumPy配列
print("形(shape):", arr.shape) # (80, 200, 3)
print("型(dtype):", arr.dtype) # uint8
# 左上のピクセルの色(R, G, B)
print("左上のピクセル:", arr[0, 0]) # [255 255 255](白)
# 配列 → Pillow画像 に戻す
img2 = Image.fromarray(arr)
print("戻した画像のサイズ:", img2.size) # (200, 80)
- カラー画像の配列は
(高さ, 幅, 3)の形。最後の3が RGB の3チャンネル(赤・緑・青の重なり)です。 arr[y, x]で1ピクセルの色[R, G, B]が取れます。白は[255, 255, 255]。np.array(img)とImage.fromarray(arr)で相互に変換できます。配列の形が(高さ, 幅)の順(幅・高さの順ではない)ことに注意しましょう。
やってみよう
arr.shape を確認したあと、arr[0, 0] の座標を arr[40, 100](文字のあたり)に変えて、色がどう変わるか見てみましょう。赤い文字の上なら [255, 0, 0] に近い値になります。
演習
上のコードで、画像の 中央のピクセル の色を print してください(高さ80・幅200 なので中央は概ね [40, 100])。
ヒント1を見る
print(arr[40, 100]) を足します。配列の添字は [y, x] の順です。
ヒント2を見る
文字にかかっていれば赤寄り、白地なら [255 255 255] が返ります。