ガボールフィルター(Gabor Filter)

ガボールフィルターは、以下の式で表される。

gaussian(σ, z) * exp ( i * z )

ここで、gaussian項はガウス分布(正規分布)の関数、exp項のiは虚数を意味し、zは(x, y):位置情報 を表している。

上記のガウス分布は、2次元の場合

gaussian (σ, x, y ) = ( 1 / 4 * π * σ ) * exp ( -1 * (x2 + y2) / (4 * σ2) )

として表される。

上記ガウシアンの式をgnuplotで描画した例は以下の通り

σ = 1(標準偏差) として、gauss(x) = 1 / (2 * sqrt(pi)) * exp(- x * x / 4 ) をプロット(シグマを1としたため、式が簡略化)

ガボール gaussian(σ, z) * exp ( i * z )の分解

式には、exp(i * z)の虚数が入っている。このパートを、実部と虚部に分ける。(exp(ix) は cosx + i sinxと分解できる)

画像処理でガボールフィルターを用いて処理を施す場合は、この二つのパートに分離して作業をすることが多い。

ガボールフィルターには、ガウシアン項とExp項があり、Exp項には虚数があり、Cos項 と Sin項に分離できる。(exp(iθ) = cosθ + isinθ)(下記で説明する回転のsin, cosとは違うので混同しないように。)

それぞれの項目と、ガウス関数を掛け合わせたのは以下の通り。

ところで、本やWebでは、ガボールカーネルの関数は、上記で示した gaussian(σ, z) * exp ( i * z ) ではなく、

gaussian(σ, z) * (exp ( i * z ) – exp ( σ2 ) )

と表される。このexp ( σ2 )を引いている理由は、

gaussian(σ, z) * exp ( i * z ) を積分した結果が0にならない(直流成分が0とならない)ためである。(これはCos項:実数部が原因している。)

exp ( σ2 )を引いた画像は以下の通り。

Cos項とガウシアン関数の畳み込みカーネル:実部実数部カーネル(cos * gaussian) 3 – dimention

Sin項とガウシアン関数を畳み込みカーネル:虚部虚数部カーネル(sin * gaussian) 3 – dimention
splot cos(x) * gauss(x,y)
splot sin(x) * gauss(x,y)
gauss(x,y) = (1 / (4 * pi)) * exp(-1 * (x ** 2 + y ** 2) / (4))
splot cos(x) * gauss(x,y)
splot sin(x) * gauss(x,y)

として描画。(ガウス関数はσを1とおいた。そのため式が簡略化されている。)注意:実際に、直流をゼロにするためには、Cos項は、

      gauss(x,y) * ( cos(x) –  exp(-1) )

とすべき。

尚、カーネルにスケーリング(a倍)を施したい場合は、

 1 / sqrt(a) * gaussian( σ, z / a ) * (exp ( i * z / a ) – exp ( σ2 ) ) 

一般的に書くと、aj 倍したい場合、

 1 / pow(a, 1 / j) * gaussian( σ, z / aj ) * (exp ( i * z / aj ) – exp ( σ2 ) ) 

となる。

なお、回転を施したい場合は、zに回転行列をzにかければよい。

z = (x, y)とすると、

  [x’]     [ cosθ    sinθ ]  [x]

  [y’]     [ -sinθ   cosθ ]  [y]

z’ = (x’, y’)

参考文献

https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%9C%E3%83%BC%E3%83%AB%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF

おすすめ記事

投稿者: 等々力 康弘

画像処理エンジニア。組み込みソフト出身。 株式会社モルフォにてR&D部門、主に機械学習業務に携わり、顔認識&顔検出のアルゴリズム開発に従事。国内特許数件、国際特許1件。 モルフォ社退社後、株式会社Dynaptico創業(CEO)。アメリカ人、スウェーデン人と3名とフードデリバリーサイトmaishoku.comを立ち上げる。社長業の他、開発業務においてバックグラウンド関連全般(Djangoを用いいたバックエンドサーバ&APIサーバーの作成、 リバースプロキシなどの負荷分散サーバ関連、OCRプログラムの作成、CISCOルータの管理, 、seleniumを用いたテストサーバーの構築、Androidアプリの開発等々)に携わる。 2019年DynapticoのCEOを辞職。 2020年2月にComputer Scienceに特化した株式会社OctOpt創業。 OSはUbuntu。Appleが苦手。Swiftのバージョンアップ対応とか死ぬほど嫌い。 Python/C++/C Twitter: @rocky_house シフト自動調整スケジュールサイトをVue.js+graphene djangoで構築. https://www.allshifter.com

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です