Oops! It appears that you have disabled your Javascript. In order for you to see this page as it is meant to appear, we ask that you please re-enable your Javascript!
スポンサーリンク

「画像認識」の「特徴量」(2):「エッジ検出」とは?どんな仕組み?「空間フィルタ」とは?どう使っているの?についてまとめました

スポンサーリンク
パターン認識
スポンサーリンク
スポンサーリンク

前回は、画像認識をするためには、

画像の特徴が必要という内容でした。

画像の中に写っているものの「局所特徴」をとらえることで、

様々な画像認識を行うことができることを説明しました。

「画像認識」の「特徴量」(1):「局所特徴」ってなに?メリットは?どんな性質が必要なの?についてまとめました

 

しかし、局所特徴はどうやって見つければいいの?

という話はしていませんでした。

そこで本記事では、

特徴量はどうやって抽出するの?

について、具体的には、

エッジ検出

を解説します。

加えて、エッジ検出で使う

空間フィルタ

についてもサクッと説明したいと思います。

その後、エッジ検出のいくつかの発展バージョンも簡単にご紹介します。

「画像認識」の「特徴量」(2):「エッジ検出」とは?どんな仕組み?「空間フィルタ」とは?どう使っているの?についてまとめました

エッジ検出とは?

エッジという言葉は、「縁」の意味があります。

例えば、白い壁の部屋に黒い犬が映った画像では、

犬の黒色と背景の白色の違いを区別できれば、

犬を抽出できますよね。

”色が黒の部分だけ抜き出す”

みたいなプログラムをかけば、認識が完了です。

 

でもこれだと、他の画像では使えそうにありませんよね。

もっと汎用的な仕組みにしたいわけです。

そこで、ものの輪郭(エッジ)を認識する方法はないかな?

と考えてみます。

すると、いろいろな画像で物体の輪郭(エッジ)という特徴を調べることができますよね。

この技術の1つが「エッジ検出」になります。

 

エッジ検出とは、物体の縁(輪郭・エッジ)を抽出する技術になります。

 

エッジ検出の仕組みとは

じゃあ、どうやって輪郭を抽出するの?

というやり方について説明しますね。

 

上で調べたかった、

白い部屋の中の黒犬の画像を考えてみましょう。

 

デジタル画像は、画素の集まりでできています。

その画素を、1つずつ調べていくと、

ある画素とその隣の画素のどこかで

  • 白から黒

または

  • 黒から白

に急激に変化する部分があるはずですよね。

急激に変化する部分を見つけて、輪郭だ!とすればいいわけです。

 

変化が大きいところを見つける

というのは、「微分」の得意分野になります。

 

エッジ検出でもこの微分のメリットを活用しています。

白黒などの画素の濃度値を画像中の場所の関数として表現しておいて、

その関数を微分してあげれば、

変化の大きなところの画素が見つかるわけです。

 

ただし、画像のデータはデジタルデータなので、

値は画素ごとに存在し、とびとびの離散量になります。

  • 離散量の微分では、隣同士の差をとることで、微分の代用とする

のが一般的です。

この差による微分の表現を「差分」とか「差分近似」と呼んだりします。

(高校数学などで習ったような、連続量の微分の扱い方とは少し違うわけです)

 

画像は、画素値データという順序を持った集合とも言えます。

この画像中の変化の大きいところ見つけたいので、

  • 元の画素値の微分を値に持った新しい画像

を作ればオッケーです。

これを作る方法の1つが、

空間フィルタ」という技術になります。

空間フィルタを作用させてできた新しい画像は、

濃度が急激に変化するところが示された画像です。

つまり、画像のエッジ(輪郭)を検出したことになります。

 

じゃあ「空間フィルタ」ってなに?

どういう仕組みなの?

ってところを次で解説しますね。

空間フィルタとは

フィルタ処理の概念図

上の図は、左に元画像、右にフィルタ処理後の画像の画素をブロックで示しています。

画素には、それぞれ、縦と横に1、2、3、4と番号が付けられていて、

それぞれの箱(B21, B31, B41など)が、

1つずつの画素を表しています。

(BはBefore、AはAfterの略で、処理前、処理後の意味でそれぞれ使っています)

この図は、

左の元画像のB32の画素をフィルタ処理して、

同じ場所に、A32の画素を作ることを表しています。

 

フィルタ処理について、もう少し具体的に説明します。

具体例:3×3の平滑化フィルタ

3×3」とは、

縦と横方向の連続した3つの画素の合計9個の画素集合をひとまとまりに考える

ということを示しています。

 

平滑化」とは、元画像のある画素値は、その周りの画素値集合との平均値に置き換える処理のことです。

平滑化は、例えば、白黒などの濃度が極端に濃い・薄い画素を処理するために用いられたりします。

画像中の白黒の画素は、ポツポツと画像を見えにくくするノイズの原因の1つです(ごま塩ノイズと呼ばれます)。

平滑化フィルタを使うことで、ごま塩ノイズを軽減することができるメリットがあります。

 

もう少し具体的に示すために、

以下のフィルタ処理について、考えてみます。

フィルタ処理の概念図

このフィルタ処理は、B32(青色)の画素について処理し、その結果を、A32(赤色)にする、という操作を表しています。

次に、3×3平滑化フィルタの具体的な計算を示します。

平滑化フィルタの具体例

3×3平滑化フィルタでは、左側の元画像のB32の周りの9個の画素の平均値を計算します。

そのためには、ピンクで囲まれた、すべての要素が1/9の3×3のオペレータをかけ算(内積計算)をします。

(オペレータは、フィルタやカーネル、マスクなど、様々な呼び方があります)

計算結果は、図の1番右に示したように、

元画像の9個の画素の値の平均値になっています。

確かにこの平滑化フィルタによる処理は、目的通り、平均値を計算しています。

そして、計算した平均値がA32という新しい画素値になるわけです。

 

このように、画像にフィルタをかける操作のことを

畳み込み(convolution)

と呼びます。

畳み込みでは、上で示したように、

画像の一部にフィルタをかけ、それらの内積を計算します。

ちなみに、信号処理の分野では、

フィルタのことを「応答関数」と読んだりします。

分野によって呼び方が変わりますが、

意味合いを把握しておくと、理解がはかどるかと思います。

 

 

話を元に戻しますね。

今はB32に注目しましたが、他の画素についても、

B11→B12→B13→・・・→B44のように、

すべての画素にそれぞれ注目して、

フィルタ処理をそれぞれ繰り返し行います。

すると、

A11からA44の新しい画素を持った新しい画像ができる

ことがわかってもらえるかと思います。

(この画像がエッジを表現した画像になります)

 

このように、

  • 空間フィルタとは、元画像の画素を処理するオペレータ(カーネル、マスク)

と言えます。

 

 

 

空間フィルタについては、なんとなくわかってもらえたのではないでしょうか。

話をエッジ検出に戻しますね。

エッジ検出では、画素値の濃度変化の大きいところを探すといいました。

変化の大きいところは、微分すればいい

というところまで説明していました。

 

なので

微分するためのオペレータを考えましょう。

注意点は、画素は離散値なので、微分は差分として表現することです。

 

ここでは、以下に示すように、

B32の画素を、微分して、その結果をA32の画素にする操作を考えます。

差分カーネル処理の概念図

差分カーネル処理の概念図

 

今、B32について考えています。

離散値の微分は、差分で考えるので、

縦方向の差分は、B42ーB32となり、これを微分値とします。

この値は、単純な引き算で求まりますが、

上のフィルタの考え方に習って、別の求め方を考えてみます。

微分フィルタによるエッジ検出

縦方向の差分カーネルの具体例

縦方向の差分カーネルの具体例

B32の画素に注目しているので、

縦横にそれぞれ1つ増やしたB33, B42とB43の画素をまとまりと考えます(上図左)。

そしてそれに、上図真ん中(ピンク)の値を持った2×2のオペレータ(カーネル)をかけ算します。

すると、その計算結果は、B42 – B32 となり、

求めたかった縦方向の差分値と一致します。

 

 

同様に、横方向の微分を考えてみます。

横方向の差分は、B33ーB32となり、これが微分値です。

以下のような値を持つオペレータ(ピンク)をかけ算すると、

横方向の微分値が求まることがわかります。

横方向の差分カーネルの具体例

横方向の差分カーネルの具体例

 

 

例ではB32の画素に注目しましたが、

これらの計算をすべての画素に行うと、

すべての画素について、縦と横の微分値が求まります。

 

あれ、1つの画素に微分値が2つある!?

 

と思われたかもしれません。

実際のエッジは、この2つの微分値を合成したものを考えます。

合成したエッジの大きさは、

(縦方向の微分の2乗)+(横方向の微分の2乗)

について、平方根をとったものになります。

こうして求めた合成したエッジの大きさを各画素の濃度値にして、

新しい画像を作成することができ、

それがエッジを表現した画像になります。

 

 

ここまでで、エッジ検出の1番基本的な考え方と具体例を示しました。

現実の画像に使う場合には、これでは性能が少し不十分です。

エッジ検出の性能を改善するために、応用的な手法が提案されていますので、

以下でサクッとご紹介します。

この他のエッジ検出方法

「ロバーツ」のエッジ検出

上での例では、縦と横の微分を求めましたが、

画像には、斜め方向の変化もあります。

斜め方向の微分も考慮したエッジ検出があります。

これを「Robertsのエッジ検出」と言います。

縦横だけのエッジ検出よりも、より綺麗にエッジを検出することができます。

 

「プリューウィットフィルタ」によるエッジ検出

上で紹介した手法群は、ノイズに弱いという特徴があります。

2×2のオペレータを3×3に拡大することで、

ノイズの影響を抑える方法があります。

この手法を「プリューウィットのエッジ検出」と言います。

 

「ソーベルフィルタ」によるエッジ検出

プリューウィットのエッジ検出と同様に、

オペレータを拡大することに加え、

注目画素をより重視する手法として、

ソーベルのエッジ検出」があります。

 

「キャニー」エッジ検出

まず最初に、ガウシアンフィルタで平滑化して、ノイズの軽減を行います。

その後、ソーベルフィルタによるエッジ検出を組み合わせる方法があります。

これを

「キャニー」エッジ検出

と呼び、今日よく使われているエッジ検出の1つです。

 

 

ここまでのものは、1次微分を用いたエッジ検出ですが、

2次微分を用いたエッジ検出法もあります。

縦方向と横方向の2次微分の和を「ラブラシアン」と呼びます。

2次微分はノイズを検出するので、

2次微分を用いたエッジ検出法では、

まずノイズ除去を行うのがポイントです。

ガウシアンフィルタでノイズを除いた後で、

ラプラシアンフィルタを適用します。

 

 

 

 

というわけで、本記事では、

特徴量の抽出法の1つとして

エッジ検出」や「空間フィルタ」を解説しました。

 

 

 

 

より詳しくは、以下の書籍にございます↓

タイトルとURLをコピーしました