オムライスの備忘録

数学・統計学・機械学習・プログラミングに関することを記す

【画像処理】フィルタリング

Index

空間フィルタリングとは

検出器の基本となる空間フィルタリング / Spatial Filtering という操作・処理がある.

空間フィルタリングとは、注目画素の値とその近傍領域の画素値を入力として 出力画像に対応する画素値を計算する処理のこと.

空間フィルタリングは、単にフィルタとも呼ばれる.



数学的定義

空間フィルタリングは、線形非線形におおまかに分類できるが、 線形空間フィルタリングを考える.

線形空間フィルタリングは、出力画素の値が、入力画素の近傍の画素値の線形結合になる処理.



入力画像を  I、注目する画素の座標を  (x,\ y) とする.



周辺の画素の座標は、 (x-1,\ y-1),\ (x+1,\ y+1) のように表せる.

また、画素値は、 I(x,\ y) I(x-1,\ y-1),\ I(x+1,\ y+1) のように書ける.

そして、空間フィルタリングによって出力される座標を  (x,\ y) としたとき、 その画素値は  \tilde{I}(x,\ y) とする.



周辺 (近傍) の範囲を  N とすると、(例では、 N=1) 近傍領域の大きさは、 (2N\ +\ 1)\ \times\ (2N\ +\ 1) となる. (例では、 3\ \times\ 3 である.)

そして、空間フィルタリングで出力される画素値の値は以下のように計算される.

 \tilde{I}(x,\ y)\ =\ \displaystyle \sum_{j=-N}^{N} \displaystyle \sum_{i=-N}^{N} F(i,\ j)\ I(x\ +\ i,\ y\ +\ j) \tag{1}



ここで、計算に利用されている  F が登場している.

 F は、画素に対する重みを表現している  (2N\ +\ 1)\ \times\ (2N\ +\ 1)行列で、 カーネル、マスク、と呼ばれる.

カーネルの大きさは、近傍の大きさと同じになっている.

また、 F(i,\ j) はフィルタ係数とも呼ぶ.



相関 / Correlation

ここまで、空間フォルタリングの処理を記したが、式 (1) の計算方法で出力する処理を 相関 / Correlation と呼ぶ.

上の例では、


\begin{array}{ccccccc}
\tilde{I}(x,\ y)&=& \displaystyle \sum_{j=-N}^{N} \displaystyle \sum_{i=-N}^{N} F(i,\ j)\ I(x\ +\ i,\ y\ +\ j) \\
\\
&=& F(-1,\ -1)\ I(x-1,\ y-1) &+& F(0,\ -1)\ I(x,\ y-1) &+& F(1,\ -1)\ I(x+1,\ y-1)\\
\\
&+& F(-1,\ 0)\ I(x-1,\ y) &+& F(0,\ 0)\ I(x,\ y) &+& F(1,\ 0)\ I(x+1,\ y)\\
\\
&+& F(-1,\ 1)\ I(x-1,\ y+1) &+& F(0,\ 1)\ I(x,\ y+1) &+& F(1,\ 1)\ I(x+1,\ y+1)
\end{array}



と計算できる.

畳み込み / Convolution

また、相関とは別の計算方法として、畳み込み / Convolution がある.

 \tilde{I}(x,\ y)\ =\ \displaystyle \sum_{j=-N}^{N} \displaystyle \sum_{i=-N}^{N} F(i,\ j)\ I(x\ -\ i,\ y\ -\ j) \tag{2}



相関との違いは、入力画像と対応するカーネルの位置.



上の例では、


\begin{array}{ccccccc}
\tilde{I}(x,\ y)&=& \displaystyle \sum_{j=-N}^{N} \displaystyle \sum_{i=-N}^{N} F(i,\ j)\ I(x\ +\ i,\ y\ +\ j) \\
\\
&=& F(-1,\ -1)\ I(x+1,\ y+1) &+& F(0,\ -1)\ I(x,\ y+1) &+& F(1,\ -1)\ I(x-1,\ y+1)\\
\\
&+& F(-1,\ 0)\ I(x+1,\ y) &+& F(0,\ 0)\ I(x,\ y) &+& F(1,\ 0)\ I(x-1,\ y)\\
\\
&+& F(-1,\ 1)\ I(x+1,\ y-1) &+& F(0,\ 1)\ I(x,\ y-1) &+& F(1,\ 1)\ I(x-1,\ y-1)
\end{array}



と計算できる.

また、畳み込み演算は、 \ast を利用して、以下のように表現する.

 \tilde{I}\ =\ F\ \ast \ I



畳み込み演算では、交換則結合法則が成立する.

 F,\ Gカーネルとすると、


\begin{align}
F\ \ast\ G\ &=\ G\ \ast\ F \\
F\ \ast\ (G\ \ast\ I)\ &=\ (F\ \ast\ G)\ \ast\ I
\end{align}


が成立する.

様々な空間フィルタ

  • 平均化フィルタ / Averaging Filter
  • ガウシアンフィルタ / Gaussian Filter
  • バイラテラルフィルタ / Bilateral Filter

平均化フィルタ / Averaging Filter

平均化フィルタは、以下のカーネルを用いる.

 F\ =\ \displaystyle \frac{1}{9} \begin{pmatrix}
1 & 1 & 1 \\
1 & 1 & 1 \\
1 & 1 & 1
\end{pmatrix}



このカーネルを画像に適用すると。画像が平滑化される.

画像のノイズを低減させる.

カーネルサイズを大きくすると平滑化の効果が大きくなる.

ガウシアンフィルタ / Gaussian Filter

注目画像とその周辺の画素に均等に重み付けを行うフィルタとは異なり、 各画素の重みを調整した平滑化を考える.

注目画像の重みを最大として、そこから遠い画素ほど重みを小さくするような加重平均を 用いる方法として、ガウシアンフィルタ / Gaussian Filter がある.

 G(x,\ y,\ \sigma)\ =\ \displaystyle \frac{1}{2\ \pi\ \sigma^{2}}\ \exp\ 
\left(\ -\ \displaystyle \frac{x^{2}\ +\ y^{2}}{2\ \sigma^{2}}\ \right)



 \sigma は、分散、スケールなどと呼ばれる.

バイラテラルフィルタ / Bilateral Filter

ガウシアンフィルタなどを用いて、画像を平滑化すると、 ノイズを低減させるが、エッジなどの有用な情報も低減させてしまう.

そこで、エッジ情報を維持しつつ平滑化を行う手法として、バイラテラルフィルタ / Bilateral Filter がある.

  • OpenCV – バイラテラルフィルタの仕組みと cv2.bilateralFilter の使い方

応用アルゴリズム

参考