本文へスキップ
BecomeCoder

Python画像認識コース · 第3章 OCRのための前処理 · レッスン8

グレースケール化 ― OpenCVでの第一歩

ブラウザで完結

導入

前章では 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_RGB2GRAYcv2.COLOR_RGB2HSV に変えると、色相・彩度・明度の別の色空間に変換されます(表示は崩れますが、変換自体は成功します)。色空間の指定でいろいろな変換ができると分かります。

演習

グレースケール画像 gray平均の明るさprint してください。

ヒント1を見る

print("平均:", gray.mean())。白地が多いので 200 以上になるはずです。

ヒント2を見る

NumPy 配列なので .mean() がそのまま使えます。

実際に動かしてみよう

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

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

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