導入
エッジ(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 の個数(=白い画素数)が数えられます。