1.非極大値抑制(Non-Maximum Suppression)
非極大値抑制とは、画素点の局所最大値を求めることである。CanyのSobel演算子の検出されたエッジは太すぎます,私たちはそれらの差分値が十分でない画素点を抑制する必要がある,最大の差分値だけを残して、"エッジを痩せる"目的を達成します。
差分方向に沿って,前と後ろの差分を比べる,差分が足りないピクセルポイントは、エッジの遷移点となり得る,非エッジピクセルを削除,局所最大値以外のすべての差分値を0に抑える,最後に細い線を残しました。
2.非極大値抑制の実現
2.1 基本的なアルゴリズムは:
- 現在のピクセルの差分強度と正負の差分方向の2つのピクセルを比較します
- 現在の画素の差分強度が他の2つの画素と比較して最大である場合、この画素点はエッジポイントとして保持され、そうでないと画素点は抑制される。
2.2 四つの差分方向の限界
Canny演算子の論文では、最大値以外の抑制は、0、90、45、135の4つの差分方向にのみ行われます,各ピクセルの点差の方向は近くの程度によってこの四つの方向で代替されます。この場合、非最大値抑制比較した隣の2つの画素は:
1) 0:左と右
2) 45:右上と左下
3) 90:上と下
4)135:左上と右下
このようにするメリットは簡単ですが、このような簡略化された方法は最高の効果を達成することができません,自然画像の中のエッジの差分方向は必ずしもこの四つの方向に沿っているとは限らないからです。そのためには補間が必要です,ピクセルポイントの中で、その位置の差分方向の両側のピクセル値が一番よく合うことを探します。
2.3 |gy|>|gx|場合
gyはC点Y方向の差分値、gxはC点X方向の差分値です
|gy|>|gx|なら、この点の差動方向がY軸方向に近いことを示していますので、g2とg4はCの上下にあります:
Cは中心位置を表します,斜めの直線は差分方向を表します(非極大値抑制は差分方向の極大値である),左の図はgyとgxの方向が同じであることを示しています,右の図はgyとgxの方向が反対です(注意原点は左上にあります),重みは:
weight = |gx|/|gy|,
したがって、この場合、内挿表現は:
dTemp1 = weight * g1 + (1-weight) * g2;
dTemp2 = weight * g3 + (1-weight) * g4;
2.4 |gy|<|gx|場合
この点の差分方向はX軸方向に近く、g 2とg 4は水平方向にあると説明します。
Cは中心の位置を表し、斜めの直線は差分方向を表します。(非極大値抑制は差分方向の極大値である),左の図はgyとgxの方向が反対で、右の図はgyとgxの方向が同じです(注意原点は左上にあります),重みは:
weight = |gy|/|gx|,
したがって、この場合、内挿表現は:
dTemp1 = weight * g1 + (1-weight) * g2;
dTemp2 = weight * g3 + (1-weight) * g4;
2.5 極大値を取得
次の作業は比較的簡単であり、中心位置CにおけるdTempの差分幅値と二つの補間点における差分幅値dTemp 1とdTemp 2とを比較し、極値点であるかどうかを決定し、コードは以下の通りである:
if(dTemp>=dTemp1 && dTemp>=dTemp2) {
// C点は境界点です
}
else {
// C点は境界点ではあり得ないので、抑制が必要です
}