導入
二値化した文字が「かすれて途切れる」「点々がつながらない」ことがあります。モルフォロジー変換(膨張・収縮)を使うと、白い部分を太らせたり細らせたりして、文字の形を整えられます。
説明
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=1 を 2 や 3 に増やすと、効果が強まります。dilate を繰り返すと文字がどんどん太くなり、やがて隣とくっつくのを確かめましょう。
演習
二値画像 binary に対して、cv2.dilate を iterations=2 でかけた結果を表示してください。
ヒント1を見る
out = cv2.dilate(binary, kernel, iterations=2) として plt.imshow(out, cmap="gray")。
ヒント2を見る
回数が増えるほど白(文字)が太くなります。