エッジ検出 — 微分が輪郭を浮かび上がらせる
エッジ(輪郭)とは輝度が急に変わる場所。ならば「変化の速さ」を測る数学の道具 — 微分 — で見つけられるはずです。1次元の直感から始めて、Sobel フィルタ、そして定番中の定番 Canny のパイプラインまで、動かしながら積み上げます。
1. まず1次元で — 微分がエッジを浮かび上がらせる
画像から横1行を取り出すと、輝度の折れ線グラフになります。エッジはこのグラフの急な坂。坂の傾きを測るのが1次微分で、エッジの位置に山(明→暗なら谷)が立ちます。さらにもう一度微分した2次微分は、エッジの両側で+と−のペアになり、エッジの中心でゼロを横切ります。
離散的な画素の世界では、微分は「隣との差」で近似します。
I′(x) ≈ [ I(x+1) − I(x−1) ] / 2 I″(x) ≈ I(x+1) − 2I(x) + I(x−1)
中心差分による1次・2次微分の近似。2次微分の係数 [1, −2, 1] は1次元のラプラシアン
1次元で見る微分 — 輝度プロファイルとその1次・2次微分
最上段は「画像の1行」そのもの、その下が輝度 I、1次微分 I′、2次微分 I″。動く縦線の位置での値と、I 上の接線(=1次微分の意味)が表示されます。「ノイズを加える」を ON にすると微分がどれほど暴れるか、そして「先にぼかす」でどう救われるかを確かめてください。
注意 — 微分はノイズ増幅器
隣接画素の差をとる操作は、細かい変動(高周波成分)ほど強調する。1画素おきにチラつくノイズは、本物のエッジと同じくらい大きな微分値を作ってしまう。だから実用のエッジ検出は必ず「平滑化してから微分する」(または平滑化を織り込んだ微分カーネルを使う)— これが次の Sobel、そして Canny の第1段の理由。
2. 2次元では「勾配ベクトル」になる
2次元の画像では、変化には向きがあります。横方向の微分 Gx と縦方向の微分 Gy を並べたベクトル ∇f = (Gx, Gy) が勾配。勾配は「輝度が最も急に増える方向」を指し、その大きさがエッジの強さ、向きがエッジの向き(エッジ線は勾配と直交)を教えてくれます。
|∇f| = √(Gx² + Gy²) θ = tan⁻¹(Gy / Gx)
勾配強度と勾配方向。Gx・Gy は Sobel カーネルとの畳み込みで求める
POINT — Sobel は「平滑化つき微分」
Sobel の Gx カーネルは、横方向の微分 [−1, 0, 1] と縦方向の平滑化 [1, 2, 1]ᵀ の積に分離できる(第5章「分離可能フィルタ」の実例)。微分と直交する向きにぼかしを掛けることで、単純な差分よりノイズに強い勾配が得られる。
Sobel フィルタ — 合成画像(ビル街)で勾配を見る
Gx(横方向の微分)は縦のエッジに、Gy は横のエッジに反応します(灰色 128 が 0、白が+、黒が−)。「勾配方向」モードは向きを色相で表示(0°=右向きが赤、90°=下向きが緑系…)。画像の上にマウスを乗せると、その画素の Gx・Gy・強度・向きと勾配ベクトルの矢印が表示されます。
3. Canny — エッジ検出の定番パイプライン
勾配強度をそのまま閾値処理すると、「太くにじんだ輪郭」「ノイズの偽エッジ」「途切れた輪郭」に悩まされます。J. Canny(1986)は良い検出・正確な位置・1エッジに1応答という3基準を立てて最適化し、いまも使われ続ける4段階のパイプラインに到達しました。
- ガウスぼかし — 微分の前にノイズを抑える(1章の教訓)。
- 勾配計算 — Sobel で強度と方向を求める(2章)。
- 非最大抑制(NMS) — 勾配方向に沿って極大でない画素を消し、太い帯を幅1画素の線に細らせる。
- 二重閾値+ヒステリシス — 高い閾値を超えた「確実なエッジ」から出発し、低い閾値以上の「弱いエッジ」をつながっている場合だけ採用する。
Canny のパイプライン — 4段階をステップ実行
閾値は「最大勾配に対する %」。スライダーを動かすと自動的に第4段階の結果が更新されます(低 > 高 にした場合は低=高として扱います)。白=強エッジ、水色=強エッジに連結されて生き残った弱エッジ、暗い赤=孤立して棄却された弱エッジ。ヒストグラムの縦線が2本の閾値です。
ヒステリシスの意味を言葉にするとこうです — 閾値が1本だと、高くすれば輪郭が途切れ、低くすればノイズだらけ。2本にして「強い証拠から出発して、弱い証拠は連結でたどる」ことで、本物の輪郭は1本につながり、孤立したノイズは消えます。低い閾値を上げ下げして、輪郭の「つながり方」だけが変わるのを確かめてください。
4. まとめ
- エッジ=輝度の急変。1次微分の山、または2次微分のゼロ交差として現れる。
- 微分はノイズを増幅するので、平滑化とセットで使う。Sobel は平滑化を織り込んだ微分カーネル。
- 2次元では勾配ベクトル (Gx, Gy)。強度 √(Gx²+Gy²) がエッジらしさ、方向が輪郭の向きを与える。
- Canny = ぼかし → 勾配 → 非最大抑制 → 二重閾値+ヒステリシス。細く・正確に・つながった輪郭が得られる定番。
一歩先へ — ゼロ交差と学習ベースのエッジ
2次微分(ラプラシアン)のゼロ交差でエッジを探す流儀もある。ガウスぼかしと組み合わせた LoG(Laplacian of Gaussian、Marr–Hildreth 法)が代表で、σ の異なる2つのガウスの差 DoG はその高速な近似として SIFT などの特徴点検出にも登場する。さらに現代では HED など学習ベースのエッジ検出が意味的な輪郭まで拾うが、興味深いことに、画像認識 CNN の第1層には Sobel そっくりの微分カーネルが自然に学習されることが知られている — 「まず勾配を取る」は人が設計しても機械が学んでも変わらない第一歩らしい。