ソーベル vs キャニー エッジ検出器
テスト画像をロボットビジョンの背後にある完全なエッジ検出パイプライン — グレースケール、ガウシアンぼかし、ソーベル勾配、非極大抑制、キャニーヒステリシス — に通し、各ステップにカーソルを合わせて1つのピクセルの背後にある数式を確認しよう。
なぜ先にぼかすのか、なぜしきい値が2つ必要なのか 🖖
微分は与えられたものすべてを増幅する。ノイズも例外ではない — 生の画像をそのまま微分すると、単一ピクセルのわずかな変動さえエッジのように見えてしまう。先にガウス関数で畳み込む(ステップ2)ことで、実際のエッジである大規模な明度変化にはほとんど手を加えずにノイズを平均化できる。だからこそ、実用的な勾配ベースの検出器はすべて、微分の前に平滑化を行う。ソーベルカーネル自体は偏微分∂I/∂xと∂I/∂yの分離可能な近似であり、垂直な軸に沿って1-2-1に重み付けすることで、推定値を中央の行または列に偏らせている。得られた大きさに単一のしきい値を設けると、不可能な選択を強いられる。低く設定すればノイズが出力に斑点を作り、高く設定すればコントラストの低いエッジが破線状の断片に分裂してしまう。ヒステリシス(ステップ6)は、1つではなく2つのしきい値を使うことでこのトレードオフを回避する — 高いしきい値(T_high)は確信の持てるエッジを見つけ、すでに強いエッジに触れているピクセルにのみ適用される低いしきい値(T_low)は、ノイズが独自の輪郭を始めさせることなく、実際の輪郭が一時的に弱い区間を通り抜けて続くことを許す。この同じ二重しきい値の発想は、フラッドフィルによるセグメンテーションやシュミットトリガー回路など、単一のカットオフではちらつきが生じる場面で使われている。
一枚の画像への二つの問い 🖖
ソーベルとキャニーは同じ画像に異なる問いを投げかける。ソーベルは勾配マップを作り、各ピクセルにそこで明るさがどれだけ急に変化するかの数値を与えるため、境界は太くグレースケールの、柔らかな光のように現れる。キャニーは同じ勾配から決断を迫る——非極大抑制は各尾根の幅方向で最も明るいピクセルだけを残し、その光を鋭い1ピクセル幅の線へと細線化し、それをエッジか否かに分類する。勾配タブとキャニータブを切り替えれば、ぼやけたマップが澄んだ輪郭へと崩れていく様子が見える。
キャニーのエッジに潜む本質的なトレードオフ 🖖
ジョン・キャニーは手探りでレシピにたどり着いたのではない。1986年の論文で彼はエッジ検出を三つの目標——本物のエッジを検出し、正確に位置を定め、エッジごとに一度だけ反応する——を持つ最適化問題として定式化し、変分法で解いた。その解はほぼ正確にガウス関数の一階微分となり、だからこそ本ツールの各ステップはあの平滑化に支えられている。彼が併せて証明した落とし穴は、ぼかしを広げるほど検出と位置特定が互いに引き合う点だ——σを大きくすると微弱なエッジは見つかるが位置がぼやけ、両方で最良となるσは存在しない。σを動かして確かめよう。
例題
- きれいな図形 - 幾何学図形 — デフォルトのCanny設定で、きれいな二値エッジマップが得られる
- チェッカーボードの勾配 - チェッカーボード — 理想的なステップエッジで、境界でSobel応答が最大になる
- 回路パターン - 基板 — sを小さくすると、Cannyの出力で細い銅箔配線が保たれる
- 平滑化した顔 - s=2.5での顔画像 — 強いぼかしでテクスチャが消え、構造的なエッジだけが残る