Cannyエッジ検出法

      No Comments on Cannyエッジ検出法

Cannyエッジ検出法は一般に四つのステップがあります。

  1. ガウススムージング
  2. Sobel法によるエッジ検出
  3. 非最大値抑制
  4. ヒステリシス閾値化

Sobel法では、ある程度のスムージングが効いています。ただ、その標準偏差は変えられない。Sobel法の前に別途スムージングのステップを組めば、より良いノイズ耐性は期待できます。

Sobel法では、一個の画素に対して、横と縦二回の検査があります。横と縦に方向での明暗変化の強さが求められ、エッジの方向は分かるようになります。仮に、横と縦の変化量を\( Mx \)と\( My \)とすれば、エッジの方向は下記の式で算出されます。

\(\theta=tan^{-1}\left( \frac{My}{Mx} \right)\)

もちろん、\( Mx \)と\( My \)の符号を考慮に入れれば、\( [0,2\pi) \) の角度は求められます。この角度を非最大値抑制のステップで活用します。

非最大値抑制の目的は、検出されたエッジを細くするためです。明暗変化は上げ下げしているので、綿花のもっとも激しいところをエッジにし、そのたの画素をエッジにしないことが目的です。

画像の画素は離散しているため、一つの画素の周辺は八個の画素しかありません。しかし、エッジの方向は非常に多いです。現在対象の画素は最大であるかどうかをより正確に検出するため、Canny法は数値補間を使用します。イメージとしては図1をご覧ください。

Canny明るさ補間

図1: Canny明るさ補間

図1に大きい丸は実在する画素を意味します。\( M(\cdot,\cdot) \)は画素の明るさです。\( M1\)と\( M2\)は補間によって算出される非実在の画素の明るさです。図1の実線の直線はエッジで、点線はエッジを跨ぐノーマル方向です。画素がノーマル方向において、最大である場合に限ってエッジにいると認定されます。この様な画素だけが保留され、そうでない点は全部消されます。

ステップ3直後の効果をまずは見てみましょう。

006.canny_edge_detection_nohysteresis

図2: ステップ3まで。

図2を詳しく見てみますと、薄い灰色の顔の輪郭は見られます。また、人の目ではなかなか見えないですが、図2に黒に使い画素は多々あります。見せるためだけ、これらの点を全部明るくしたバージョンは図3です。

図3: ステップ3の結果にある黒に近い点を明るく見せる。

図3: ステップ3の結果にある黒に近い点を明るく見せる。

黒に近い点は所謂ノイズで形成されています。エッジから除外されるべきです。これはステップ4、ヒステリシス、の役割です。ヒステリシスとは延滞です。エッジに充分なり得る一点から初め、周辺に探って行きます。エッジになり得ない点を除き、すべての点はエッジにする。結果は驚きほどです。図4です。

図4: Canny最終版

図4: Canny最終版(9×9のスムージング(標準偏差=3.5)とSobelテンプレート)

輪郭だけが残りました。顔の主要特徴は残されています。

Canny法の欠点はスピードにあります。ステップ1とステップ2はかなり時間を食います。もちろんテンプレートサイズを小さくされば時間短縮になります。効果は少し落ちますが、まあ~、そんなに悪くない。

図5: Canny法テンプレート3x3、その他は図4と同じ

図5: Canny法テンプレート3×3、その他は図4と同じ

Leave a Reply

Your email address will not be published. Required fields are marked *