本文へスキップ
BecomeCoder

Python画像認識コース · 第4章 特徴と領域の検出 · レッスン14

モルフォロジー ― 文字を太らせる・やせさせる

ブラウザで完結

導入

二値化した文字が「かすれて途切れる」「点々がつながらない」ことがあります。モルフォロジー変換(膨張・収縮)を使うと、白い部分を太らせたり細らせたりして、文字の形を整えられます。

説明

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

# 白背景に黒文字 → 文字を白にした二値画像を用意
base = np.full((100, 260), 255, dtype=np.uint8)
cv2.putText(base, "MORPH", (10, 70), cv2.FONT_HERSHEY_SIMPLEX, 1.5, 0, 2)
_, binary = cv2.threshold(base, 128, 255, cv2.THRESH_BINARY_INV)  # 文字が白

kernel = np.ones((3, 3), np.uint8)          # 3×3 の構造要素
dilated = cv2.dilate(binary, kernel, iterations=1)   # 膨張(白を太らせる)
eroded  = cv2.erode(binary, kernel, iterations=1)    # 収縮(白をやせさせる)

fig, ax = plt.subplots(1, 3, figsize=(10, 3))
ax[0].imshow(binary, cmap="gray");  ax[0].set_title("binary");  ax[0].axis("off")
ax[1].imshow(dilated, cmap="gray"); ax[1].set_title("dilate");  ax[1].axis("off")
ax[2].imshow(eroded, cmap="gray");  ax[2].set_title("erode");   ax[2].axis("off")
  • kernel(構造要素)… 処理の「筆の太さ」。3×3 なら周囲1マスに効きます。
  • cv2.dilate(膨張)… 白い領域を太らせます。途切れた文字をつなぐのに使います。
  • cv2.erode(収縮)… 白い領域をやせさせます。細かいノイズを消すのに使います。
  • 膨張のあと収縮する「クロージング」、逆の「オープニング」を組み合わせると、形を保ったまま整えられます(cv2.morphologyEx)。

やってみよう

iterations=123 に増やすと、効果が強まります。dilate を繰り返すと文字がどんどん太くなり、やがて隣とくっつくのを確かめましょう。

演習

二値画像 binary に対して、cv2.dilateiterations=2 でかけた結果を表示してください。

ヒント1を見る

out = cv2.dilate(binary, kernel, iterations=2) として plt.imshow(out, cmap="gray")

ヒント2を見る

回数が増えるほど白(文字)が太くなります。

実際に動かしてみよう

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

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

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