導入
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=3 を fx=5, fy=5 にすると、より大きく拡大されます。INTER_NEAREST と INTER_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) になります。