空間フィルタリングとは??
空間フィルタリングは画像からエッジやコーナーなどの特徴点(キーポイント)を抽出するための操作で、注目する画素とその周辺画素を用いて計算する。
単にフィルタと呼ばれることもある。
式で定義してみる。
相関
入力画像をI(x,y)、出力画像をJ(x,y)とし、(2N + 1)×(2N + 1)の領域を利用するとき、
$$
J(x,y) = \sum_{j = -N}^{N} \sum_{i = -N}^{N}F(I,j)I(x+i,y+j)
$$
と計算されるものを相関という。
(2N + 1)×(2N + 1)の行列F(I,j)はカーネルまたはマスクと呼ばれ、これを変化させることで様々な出力が得られる。
畳み込み
入力画像をI(x,y)、出力画像をJ(x,y)とし、(2N + 1)×(2N + 1)の領域を利用するとき、
$$
J(x,y) = \sum_{j = -N}^{N} \sum_{i = -N}^{N}F(I,j)I(x-i,y-j)
$$
と計算されるものを畳み込みという。
畳み込みは、
$$
J = F*I
$$
と表すこともある。
畳み込み演算は、相関のカーネルをx,y方向で反転させたものと同一と考えることができる。
空間フィルタリングの種類
空間フィルタには、様々な種類があるが代表的な平均化フィルタ、ガウシアンフィルタ、ばいいラテラルフィルタを紹介する。
平均化フィルタ
以下のようなカーネルを使用する。
$$
F = \frac{1}{9}
\begin{pmatrix}
1 & 1 & 1 \
1 & 1 & 1 \
1 & 1 & 1
\end{pmatrix}
$$
平均化フィルタを用いると、画像のノイズが低減される。これを平滑化という。
上で示したのは、3×3の平均化フィルタだが、サイズを大きくすることもできる。
カーネルサイズが大きくなると、平滑化の効果が大きくなるが、大きすぎると全体的にぼやけた画像になってしまう。
ガウシアンフィルタ
以下のようなカーネルを使用する。
$$
G(x,y,\sigma) = \frac{1}{2π \sigma}exp(-\frac{x^{2} + y^{2}}{ 2\sigma^{2}})
$$
平均化フィルタでは、中心画素と周辺画素に同様の重み付けをしていた。
一方で、ガウシアンフィルタは中心に近いほど重みは大きくなり、遠いほど小さくなる。
ガウシアンフィルタは平均化フィルタ同様、入力画像の平滑化を行う。
$\sigma$はスケールといい、平滑化の範囲を定めるパラメータである。
$\sigma$が大きくなるほど、平滑化の範囲が広くなる。
これまでの2つを用いると、入力画像が平滑化されるが、全体的にぼやけてしまい、エッジやコーナーなどの重要な情報まで失ってしまう。そこで提案されたフィルタがバイラテラルフィルタである。
バイラテラルフィルタ
入力画像をI(x,y)、出力画像をJ(x,y)としたとき、
$$
W(x,y,i,j) = exp(-\frac{(x - i)^{2} + (y - j)^{2}}{ 2\sigma_d^{2}} - \frac{|| I(x,y) - I(i,j) ||^{2}}{2\sigma_r^{2}})
$$
$$
J(x,y) = \frac{\sum_{j = -N}^{N} \sum_{i = -N}^{N}W(x,y,i,j)I(x-i,y-j)}{\sum_{j = -N}^{N} \sum_{i = -N}^{N}W(x,y,i,j)}
$$
で表されるフィルタがバイラテラルフィルタである。
式を見てみると、ガウシアンフィルタと類似しているが、バイラテラルフィルタはさらに注目画素と周辺画素の輝度の差を用いて重み付けされている。
バイラテラルフィルタを用いると、平均化フィルタ、ガウシアンフィルタよりもエッジやコーナーがきちんと保持される。
まとめ
空間フィルタリングは、画像に対してカーネルを掛け合わせる処理であり、カーネルの中身、大きさによって画像に様々な処理を施す。
入力画像の平滑化をするフィルタとして、平均化フィルタ、ガウシアンフィルタなどがあるが、これらはエッジ、コーナーなどの重要な情報まで失ってしまう。
これらの問題を解消したのが、バイラテルフィルタである。