概要
Q.77〜80ではガボールフィルタを生成し、回転、畳み込み、方向別応答の合成までを実装します。 ガボールフィルタは方向と空間周波数の両方を選択でき、エッジやテクスチャの特徴抽出に使えます。
カーネルを生成する(Q.77)
ガウシアン窓と正弦波を掛け合わせてカーネルを作ります。σが応答する範囲、波長λが
対象とする模様の細かさ、角度θが方向を決めます。
G(x, y) = exp(-(x'² + γ²y'²) / 2σ²) cos(2πx' / λ + ψ)
生成後は係数の絶対値和などで正規化し、画像全体の明るさが過度に変わらないようにします。
方向を変える(Q.78)
座標を0、45、90、135度へ回転し、方向の異なる4種類のカーネルを描画します。角度ごとに 縞模様の向きが変わることを確認できます。
画像へ適用する(Q.79)
各方向のカーネルをグレースケール画像へ畳み込みます。特定方向の線や縞とカーネルが一致した 場所で大きな応答が得られます。
方向別応答を合成する(Q.80)
4方向の応答を画素ごとに加算し、向きに偏らない特徴画像を作ります。単一方向のエッジ検出から、 複数方向をまとめたテクスチャ表現へ発展させる処理です。
Sobelフィルタとの違い
Sobelは主に局所的な輝度勾配を求めます。ガボールフィルタは方向に加えて周波数も指定できるため、 一定間隔の縞や繰り返し模様へ選択的に反応できます。
カーネルの各パラメータ
ガボールカーネルは、向きθに合わせて座標を回転したx'、y'を使います。
x' = x cos θ + y sin θ
y' = -x sin θ + y cos θ
g(x, y) = exp(-(x'² + γ²y'²) / 2σ²) cos(2πx' / λ + ψ)
λは反応する縞の間隔、θは向き、σは観測範囲、γは楕円率、ψは波の位相です。
1つずつ変えたカーネル画像を表示すると、出力との対応を理解しやすくなります。
実装と正規化
カーネルサイズは通常σに対して十分大きい奇数にします。係数の平均を引いてDC成分を抑えると、
一様な明るさへの反応を減らせます。正・負の応答を表示するときは絶対値を取る方法と、128を0として
符号を残す方法で見え方が異なります。
方向と波長の組み合わせごとに畳み込みが必要なため、フィルタバンクは計算量が増えます。 同じカーネルを毎フレーム生成せずキャッシュし、必要な方向数と画像解像度を用途に合わせて絞ります。