本文へスキップ
BecomeCoder

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

リサイズと拡大 ― 小さい文字を大きくする

ブラウザで完結

導入

OCR は「文字が小さすぎる」と極端に弱くなります。目安として、文字の高さは 20〜30 ピクセル以上ほしいところ。小さい画像は拡大してから認識にかけます。拡大の“補間”方法で仕上がりが変わります。

説明

import numpy as np
import cv2
import matplotlib.pyplot as plt

# 小さな文字画像を作る
small = np.full((30, 90), 255, dtype=np.uint8)
cv2.putText(small, "abc", (5, 22), cv2.FONT_HERSHEY_SIMPLEX, 0.6, 0, 2)

# 3倍に拡大(補間方法を変えて比較)
nearest = cv2.resize(small, None, fx=3, fy=3, interpolation=cv2.INTER_NEAREST)
cubic   = cv2.resize(small, None, fx=3, fy=3, interpolation=cv2.INTER_CUBIC)
print("元のサイズ:", small.shape, "→ 拡大後:", cubic.shape)

fig, ax = plt.subplots(1, 3, figsize=(10, 3))
ax[0].imshow(small, cmap="gray");   ax[0].set_title("small");        ax[0].axis("off")
ax[1].imshow(nearest, cmap="gray"); ax[1].set_title("nearest x3");   ax[1].axis("off")
ax[2].imshow(cubic, cmap="gray");   ax[2].set_title("cubic x3");     ax[2].axis("off")
  • cv2.resize(画像, None, fx=倍率, fy=倍率, interpolation=方法) … 拡大・縮小します。fx/fy は横・縦の倍率。
  • INTER_NEAREST(最近傍)… 一番近い点をそのままコピー。速いがギザギザになります。
  • INTER_CUBIC(バイキュービック)… 周囲から滑らかに補間。拡大時にきれいで、OCR 前の拡大に向きます。
  • 具体的なサイズを指定するなら cv2.resize(画像, (幅, 高さ)) の形も使えます(幅・高さの順なので注意)。

やってみよう

fx=3, fy=3fx=5, fy=5 にすると、より大きく拡大されます。INTER_NEARESTINTER_CUBIC を見比べ、なめらかさの違いを確かめましょう。

演習

small縦横4倍 に、INTER_CUBIC で拡大して表示してください。

ヒント1を見る

out = cv2.resize(small, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)

ヒント2を見る

plt.imshow(out, cmap="gray") で表示。拡大後の out.shape(120, 360) になります。

実際に動かしてみよう

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

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

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