本文へスキップ
BecomeCoder

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

エッジ検出 ― 輪郭線を浮かび上がらせる

ブラウザで完結

導入

エッジ(edge) とは、明るさが急に変わる境目のこと。文字や物の“輪郭線”です。エッジを取り出すと、画像から形の情報だけを抜き出せます。定番は Canny 法です。

説明

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, 20), "EDGE", fill=(20, 20, 20), font=ImageFont.load_default(size=56))
gray = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2GRAY)

# Cannyエッジ検出(2つのしきい値で「強い/弱いエッジ」を判定)
edges = cv2.Canny(gray, 50, 150)

fig, ax = plt.subplots(1, 2, figsize=(8, 3))
ax[0].imshow(gray, cmap="gray");  ax[0].set_title("gray");  ax[0].axis("off")
ax[1].imshow(edges, cmap="gray"); ax[1].set_title("canny edges"); ax[1].axis("off")
  • cv2.Canny(画像, 下限, 上限) … エッジを検出し、輪郭線を白(255)、それ以外を黒(0)で返します。
  • 2つのしきい値は「これ以上はっきりした変化はエッジ」「これ未満は無視」の境目。上限を上げるとエッジが減り、下げると細かい線まで拾います。
  • 文字が黒い枠線のように浮かび上がれば成功です。

やってみよう

cv2.Canny(gray, 50, 150) の数値を (100, 200)(20, 80) に変えて、拾われるエッジの量がどう変わるか観察しましょう。

演習

cv2.Canny のしきい値を (30, 100) にしてエッジ画像を作り、白いピクセル(エッジ)の数print してください。

ヒント1を見る

edges = cv2.Canny(gray, 30, 100) のあと print("エッジ画素数:", (edges == 255).sum())

ヒント2を見る

edges == 255 は真偽の配列。その .sum() で True の個数(=白い画素数)が数えられます。

実際に動かしてみよう

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

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

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