2017-05-06 - 2018-05-30 (update) |
|
|
*Canny edge detector とは
画像上から輝度の勾配の強いエッジを検出する方法の1つです[1].単に勾配の強さを計算するSobel Filterとは異なり,勾配の強さのピークを検出します.検出結果を図1に示します.
[img:m9zw]
{{small:図1 エッジの検出結果}}
{{small:[1]J.Canny, "A Computational Approach To Edge Detection", IEEE Transactions on Pattern Analysis and Machine Intelligence(PAMI), 1986}}
{{small:[link:https://pdfs.semanticscholar.org/55e6/6333402df1a75664260501522800cf3d26b9.pdf] }}
*サンプルコード (C++)
ライブラリ:[link:simplesp]
サンプルコード:simplesp/sample/sp/filter
Lennaの画像からエッジを検出します.
*アルゴリズム
ここでは,Canny edge detectorの処理の手順を説明します.
0.画像にガウシアンフィルタを適応してノイズを除去する
1.画像の各画素について勾配の強さと方向を計算する
2.勾配の方向を参考に勾配の強さのピークを検出する
3.Low Hightの2つの閾値に基づいて,検出結果を閾値判定する
**0.ノイズ除去
画像に含まれる高周波ノイズの影響を抑えるため,ガウシアンフィルタを適応してノイズを除去します.
**1.勾配の強さと方向を計算
ソベルフィルタなどの勾配を計算するフィルタを適応して,画像の各画素について勾配の強さと方向を計算します.注目する画素について,X方向のソベルフィルタの応答を{$Gx$},Y方向のソベルフィルタの応答を{$Gy$}とした時,勾配の強さ{$G$}と方向{$A$}は次の式で計算できます.
{$$G = \sqrt{Gx^2 + Gy^2}$$}
{$$A = tan^{-1}\frac{dy}{dx}$$}
{{small:勾配の強さについては{$G = |Gx| + |Gy|$}とする場合もあります.}}
**2.勾配の強さのピークを検出 (non-maximum suppression)
勾配の方向を参考に勾配の強さのピークを検出します.勾配の方向は例えば図2のような輝度の分布を持つ画素では,左上の方向を向きます.この方向に沿う前後の画素の勾配の強さと比べ,注目する画素の勾配の強さが強い場合はピークとして検出します.
[img:dwjr]
{{small:図2 勾配の方向}}
**3.Low Hightの閾値判定 (hysteresis threshold)
前段の処理で検出したピークをエッジの候補として,閾値判定に基づいて信頼度の低い候補を除きます.まずHigth以上の勾配の強さを持つ候補はエッジとして出力します.次にLow以上の勾配の強さを持つ候補であって,すでに検出したエッジと繋がっている候補をエッジとして出力します.Cannyの方法では,この2つの判定によって勾配の弱いエッジもうまく取りこぼさないように検出します.
>> ご意見・ご質問など お気軽にご連絡ください.info