本文へスキップ
BecomeCoder

Python画像認識コース · 第2章 画像をコードで扱う · レッスン6

画像とNumPy配列を行き来する ― shape と channel

ブラウザで完結

導入

画像処理では「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) の形。最後の 3RGB の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] が返ります。

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、本物の Pillow・OpenCV(Pyodide)で画像処理をその場で試せます。処理した画像は図として下に表示されます。初回や OpenCV を使う回は読み込みに時間がかかります(数十秒かかることがあります)。しきい値やフィルタの数値を書き換えて、画像の変化を確かめましょう(画像に描く文字は表示が崩れるため英字で書きます。Tesseract などOCRエンジン本体は第5章の読み物で解説します)。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。