導入
前章では Pillow の convert("L") でグレースケール化しました。実務で前処理を担う OpenCV では cv2.cvtColor を使います。同じことを OpenCV でやってみましょう。
説明
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import cv2
import matplotlib.pyplot as plt
# 練習用のカラー文字画像を作る
img = Image.new("RGB", (300, 100), "white")
draw = ImageDraw.Draw(img)
draw.text((15, 25), "OpenCV", fill=(30, 90, 200), font=ImageFont.load_default(size=48))
arr = np.array(img) # RGB の NumPy 配列
# OpenCV でグレースケールに変換
gray = cv2.cvtColor(arr, cv2.COLOR_RGB2GRAY)
print("カラーの形:", arr.shape) # (100, 300, 3)
print("グレーの形:", gray.shape) # (100, 300)
plt.imshow(gray, cmap="gray")
plt.title("cv2 grayscale")
plt.axis("off")
cv2.cvtColor(画像, 変換の種類)… 色空間を変換します。cv2.COLOR_RGB2GRAYは「RGB → グレー」の指定です。- 結果は
(高さ, 幅)の2次元配列になります(第2章のグレー画像と同じ形)。
OpenCV の落とし穴: OpenCV は伝統的に色を BGR(青・緑・赤の順)で扱います。今回は Pillow が作った RGB 配列なので
COLOR_RGB2GRAYを使いました。cv2.imreadで読んだ画像ならCOLOR_BGR2GRAYになります。順番を間違えると色が入れ替わるので注意しましょう。
やってみよう
cv2.COLOR_RGB2GRAY を cv2.COLOR_RGB2HSV に変えると、色相・彩度・明度の別の色空間に変換されます(表示は崩れますが、変換自体は成功します)。色空間の指定でいろいろな変換ができると分かります。
演習
グレースケール画像 gray の 平均の明るさ を print してください。
ヒント1を見る
print("平均:", gray.mean())。白地が多いので 200 以上になるはずです。
ヒント2を見る
NumPy 配列なので .mean() がそのまま使えます。