Cannyエッジ検出法は一般に四つのステップがあります。
- ガウススムージング
- Sobel法によるエッジ検出
- 非最大値抑制
- ヒステリシス閾値化
Sobel法では、ある程度のスムージングが効いています。ただ、その標準偏差は変えられない。Sobel法の前に別途スムージングのステップを組めば、より良いノイズ耐性は期待できます。
Sobel法では、一個の画素に対して、横と縦二回の検査があります。横と縦に方向での明暗変化の強さが求められ、エッジの方向は分かるようになります。仮に、横と縦の変化量を\( Mx \)と\( My \)とすれば、エッジの方向は下記の式で算出されます。
\(\theta=tan^{-1}\left( \frac{My}{Mx} \right)\)
もちろん、\( Mx \)と\( My \)の符号を考慮に入れれば、\( [0,2\pi) \) の角度は求められます。この角度を非最大値抑制のステップで活用します。
非最大値抑制の目的は、検出されたエッジを細くするためです。明暗変化は上げ下げしているので、綿花のもっとも激しいところをエッジにし、そのたの画素をエッジにしないことが目的です。
画像の画素は離散しているため、一つの画素の周辺は八個の画素しかありません。しかし、エッジの方向は非常に多いです。現在対象の画素は最大であるかどうかをより正確に検出するため、Canny法は数値補間を使用します。イメージとしては図1をご覧ください。
図1に大きい丸は実在する画素を意味します。\( M(\cdot,\cdot) \)は画素の明るさです。\( M1\)と\( M2\)は補間によって算出される非実在の画素の明るさです。図1の実線の直線はエッジで、点線はエッジを跨ぐノーマル方向です。画素がノーマル方向において、最大である場合に限ってエッジにいると認定されます。この様な画素だけが保留され、そうでない点は全部消されます。
ステップ3直後の効果をまずは見てみましょう。
図2を詳しく見てみますと、薄い灰色の顔の輪郭は見られます。また、人の目ではなかなか見えないですが、図2に黒に使い画素は多々あります。見せるためだけ、これらの点を全部明るくしたバージョンは図3です。
黒に近い点は所謂ノイズで形成されています。エッジから除外されるべきです。これはステップ4、ヒステリシス、の役割です。ヒステリシスとは延滞です。エッジに充分なり得る一点から初め、周辺に探って行きます。エッジになり得ない点を除き、すべての点はエッジにする。結果は驚きほどです。図4です。
輪郭だけが残りました。顔の主要特徴は残されています。
Canny法の欠点はスピードにあります。ステップ1とステップ2はかなり時間を食います。もちろんテンプレートサイズを小さくされば時間短縮になります。効果は少し落ちますが、まあ~、そんなに悪くない。