エッジ検出

概要

 画像のエッジ(edge)とは、画素値が急峻に変化する点です。画素値の変化の大きさを「勾配(Gradient)」や「エッジの強さ」と言います。
 エッジは物体の輪郭を示す場合が多く、物体認識において重要な要素と言えます。エッジの検出は、特定のオブジェクトの抜き出し、2 つの画像間の対応点算出、さらに複雑な画像認識のための前処理などに用いられる基礎的な画像処理の一つです。

考え方

 ディジタル画像は、量子化に基づく画素(pixel)を最小単位としており、画素はそれぞれが縦および横方向で表わす一意の座標値を持ちます。座標 (row, col) の情報は画素値のみです。よってディジタル画像は、画素値を従属変数とする row および colの関数 f(row, col) と考えることができます。座標 (row, col) におけるエッジの強さは、近傍の画素から局所的な画素値の変化を数値で表します。よって、エッジの強さを求めるには、微分を用います。ただし、ディジタル画像は離散的な値をとるので、近傍画素との差分または一階線形の偏微分に基づく勾配を求めるための畳込み演算を用います。
 画素値の変化が「急峻である」とは、微分で求めたエッジの強さが変化することを意味します。したがって、二階線形の編微分に基づくオペレータ(Laplacian) による演算の結果として、ゼロではない値を持つ箇所--- 実際はその近傍に存在する値がゼロの点(ゼロクロス点) --- にエッジがあると言えます。

 「勾配を求めること」と「ゼロクロス点を検出すること」を、いずれも「エッジ検出」と言いますが、それぞれの結果は異なります。また、ゼロクロス点は、勾配の値に対する閾値処理と細線化処理によって求める手法が一般的です。

勾配を求める

近傍画素との差分

 画像 f(row, col) に対して、row (水平方向)の座標値を i, col (鉛直方向)の座標値を j で表します。このとき、それぞれの方向について、勾配の値を次のように求めます。

水平方向 … f '(row) = f(i + 1, j) - f(i, j)
鉛直方向 … f '(col)  = f(i, j + 1) - f(i, j)

このとき、エッジの強さは以下のように計算します。

f '(i, j) = sqrt[{f '(row)}2 + {f '(col)}2]        (1)
または
f '(i, j) = |f '(row)| + |f '(col)|

また、以下の式でエッジの方向を求めることができます

 θ = tan-1(f '(col)/f '(row))        (2)

フィルタリング

 ここでは、フィルタリングに用いるオペレータのみを紹介します。演算については、別途解説をご参照願います。水平方向および鉛直方向のそれぞれの勾配に対して、式(1)によってエッジの強さを、式(2)によってエッジの方向を計算することができます。

Gradient(微分)

水平方向 鉛直方向
0 0 0
0 1 -1
0 0 0
0 0 0
0 0 1
0 -1 0

Roberts フィルタ [1]

斜め方向の勾配であり、厳密には「Roberts勾配」と呼ぶべきかもしれません。

水平方向 鉛直方向
0 0 0
0 1 0
0 0 -1
0 0 0
0 1 0
0 -1 0

Prewitt フィルタ [2] --- (プレビィット)

水平方向 鉛直方向
1 0 -1
1 0 -1
1 0 -1
1 1 1
0 0 0
-1 -1 -1

Sobel フィルタ [3] --- (ゾーベル)

水平方向 鉛直方向
1 0 -1
2 0 -2
1 0 -1
1 2 1
0 0 0
-1 -2 -1

 

ゼロクロスを求める…ラプラシアン および ラプラシアン・フィルタ

 座標 f(i, j) における Laplacian f (2)(i, j)は、次の式で求めることができます。

f (2)(i, j) = 4 * f(i, j) - {f(i - 1, j) + f(i + 1, j) + f(i, j - 1) + f(i, j + 1)}        (3)

以下は、Laplacian をフィルタリングで求めるためのオペレータです。

例1 例2 例3
0 1 0
1 4 1
0 1 0
1 1 1
1 8 1
1 1 1
1 -2 1
-2 4 -2
1 -2 1

ゼロクロスを求める…アルゴリズム

 エッジ検出処理は、近傍画素との画素値の差分に基づくため、雑音に対して極めて脆弱です。よって前処理として画像の最適化(主に平滑処理)は必須です。またゼロクロス点は勾配の局所的な極大値に基づくため、後処理として2値化と細線化を必要とします。近年のエッジ検出は、最適化→微分演算→2値化、細線化 の手順を採る傾向にあります。

 画像の最適化に良く用いるのは、ガウシアンフィルタです。Marr と Hildreth [4] が、ラプラシアンにガウシアンフィルタを適用したことを皮切りに、Canny [5], Bergholm [6], Rothwell [7] のアルゴリズムが採用しています。特に Canny は、画像の最適化フィルタの一般解を示し、これがガウス関数の一次導関数で近似できることを示しています。ただしガウシアン・フィルタには抽出したエッジのズレを引き起こすといった問題も指摘されています[8]
 閾値処理では、画像全体の勾配が弱い場合を考慮して、閾値の基準として勾配強度を直接指定しないことが望ましいです。多くは、画像の全画素における勾配強度を整列して「弱い勾配から全体の x % を棄却する」とし、x を指定して、棄却されなかった勾配の最小値を閾値としています。

 ここでは、いくつかのアルゴリズムを紹介します。

Canny

Bergholm

小泉 [9] (拙作です…)

参照

関連リンク

関連記事

更新履歴

2008/08/20: 作成


Back / Studying / Top