画像のフィルタリング: (1) 空間フィルタリング(Spatial Filtering)

1. 空間フィルタリング(spatial filtering)の概要

この記事では,画像フィルタリング(image filtering)のうち,空間ドメイン上で局所演算操作を行い画像全体のフィルタリングを行う空間フィルタリング (spatial filtering)の代表的なものをまとめる.

画像フィルタリング (image filtering)とは,$3 \times 3$ や $5 \times 5$ 画素サイズの「局所演算子 (Local Operator) (もしくはカーネル(kernel)と呼ぶことも多い)」の窓関数を用いて,スライディングウィンドウ処理により画像の編集を行う処理のことをいう(例:平滑化,ノイズ除去,エッジ検出など).

スライディングウィンドウ時は,移動するフィルタ窓の各参照画素$\bm{p}$ (カーネル窓の中心にある画素位置)において,$\bm{p}$周辺の$k \times k$の画素値と$k \times k$のカーネル値の間で畳み込み (convolution) 処理を行い,画像をフィルタリングする (2節).画像フィルタリングの種類としては,3節で紹介する「基本的な画像編集処理」を実現する各種カーネルが考案されてきた.昔は外観検査や,画像編集ソフトの中だけで使われる専門的な処理であったが,近年ではカメラアプリやInstagramやビデオ会話アプリ等を通して,一般人にも身近になった.

1.1 記事の構成

この記事は2節以降,以下の構成で,主要な空間フィルタの紹介を行う.

  • 2節:空間フィルタリング (spatial filtering) の一般系
  • 3節:カテゴリ別に代表的な空間フィルタを紹介
    • 3.1 平滑化 (smoothing) :ガウスフィルタ,メディアンフィルタ.
    • 3.2 鮮鋭化 (sharpening):アンシャープマスキング
    • 3.3 エッジ検出 (edge detection) :微分フィルタ,Sobelフィルタ,Laplacianフィルタ.
  • 4節:まとめ

2. 空間フィルタリング(spatial filtering) の一般系

この2節では,まず任意のカーネルを用いた空間フィルタリング処理について紹介する.その後3節で,カーネルの種類ごとに,どのような画像処理結果が生じるかを整理する.

2.1 カーネルを用いた畳み込み処理:線形フィルタ.

画像フィルタリングに用いるカーネル窓$W$のサイズを $(2k+1) \times (2k+1)$ とし,カーネル窓内の局所座標の各点を$(i,j)$で表すとする(カーネル中心を原点とした座標系).$2k+1$と窓幅が奇数になるのは,参照画素$p$の前後$k$や上下$k$を局所範囲とする窓幅を,畳み込み演算向けに用意したいためである.

点$\bm{p}$の近傍$(2k+1) \times (2k+1)$において画像フィルタリングを行う局所演算子(Local Operator) $J(p)$は,画像$I$上の座標$p=(x,y)$周辺の輝度値$I(x+i, y+j)$と,$W^{\prime}(\bm{p})$との間の畳込み(convolution)として,以下のように定義できる (※ 畳み込みは2次元の離散近似):

$$ J(p) = I * W^{\prime}(p) = \frac{1}{S} \sum^{k}_{i=-k} \sum^{k}_{j=-k} w^{\prime}_{i,j} \cdot I(x+i, y+j) $$

ここで,$W^{\prime}(p)$は,元のフィルタカーネル$W(p)$をx軸とy軸の両軸に対して反転させたカーネルである.また,$w^{\prime}_{i,j} \in \mathbb{R}$は反転後カーネル$W^{\prime}(p)$の各位置$(i,j)$における重み係数であり,$S > 0$は正規化・スケーリング用の係数である.$i$や$j$が画像$I$の境界範囲をはみ出してしまう場合は,先にパディング(padding)処理を行い,周辺に値を詰めておいた画素値 $I(x+i,y+j)$ を用いる.

カーネルの各重み値$w^{\prime}_{i,j}$が,それぞれのフィルタにおいてどのような値に設定されるかについては,3節で紹介する.

2.2 畳み込みを使用しない非線形な局所演算

空間フィルタリングを行うための画像フィルタ(カーネル)の中には,2.1節のように事前に準備したフィルタとの畳み込み(線形の積和)演算は行わず,max関数やmean関数などの初等関数によって,窓内の局所演算を済ませるものもある.

例えば,カーネル窓$(2k+1) \times (2k+1)$内の局所的な最大値を出力するMaxフィルタでは,以下のカーネル窓内最大値の演算を各画素$\bm{p}$で行う:

$$ J(\bm{p}) = max{I(x+i,y+j): -k \leq i \leq k \cap -k \leq j \leq k} $$

参照位置 $\bm{p} =(x,y)$の周辺のカーネルの全画素値の平均値を,フィルタの出力としている.このような,非線形演算を行う「単純な初等関数」も,空間フィルタリングには使用することができる.

3. カテゴリ別の代表的な空間フィタリング(spatial filtering)

3.1 基本的な平滑化 (smoothing) 向けの画像フィルタ

平滑化 (smoothing) は,隣接データ値を滑らかにする処理を通して,ノイズ値や外れ値を除去する処理である.

ボックスフィルタ

2.2節にて取り上げた「平均化フィルタリングを行う単純なカーネル」のことを,通称ボックスフィルタ(box filter)と呼ぶ.ボックスフィルタにより単純な平滑化を実行できる.

ガウシアンフィルタ (Gauss Filter)

ボックスフィルタのカーネルの各位置で,カーネル中心位置を平均とした2Dガウシアンで重み付けも行なうフィルタをガウシアンフィルタ(Gauss Filter)と呼ぶ (図1).ボックスフィルタは単に平均を計算するだけだが,がうし案フィルタでは,ガウス分布の重み値を用いて重み付けを行うカーネルで畳み込むことにより,カーネル中心の輝度値を重視した重み付け平均値を出力することにより,ボックスフィルタよりも更に滑らかな出力画像を得ることができる.

次の,2次元ガウシアン関数を用いて,ガウシアンの中心位置(平均)がカーネルの中心の座標にあり,任意の標準偏差$\sigma$を設定したものをガウシアンフィルタとして用いる(※カーネルの局所座標中心を$(0,0)$とする):

$$ G_{\sigma}(x,y) = \frac{1}{2 \pi \sigma^2} \exp(- \frac{x^2+y^2}{2\sigma^2})$$

以下の図1(a)は,$3 \times 3$で$\sigma = 1.3$のガウシアンのカーネルの輝度値を3次元上で可視化したもので,図1(b)がそれを具体的に数値で表記したものである:

図1 (a) ガウシアンフィルタのカーネル
図1 (b) ガウシアンフィルタのカーネル

また,ガウシアンフィルタを $\sigma$ の値を変えて実行した結果画像を示したものが以下の図2である.$\sigma$の値を増やすほどノイズを抑制することはできるが,反面,画面のボケ(blur)具合は強ってしまうトレードオフがガウシアンフィルタには存在する.

ガウイシアンフィルタ結果のカーネルサイズによる違い
図2 ガウシアンフィルタによる処理結果のカーネルサイズによる違い (scikit-imageで作成).左上が入力の元画像で,それ以外が時計回り順に,$\sigma = 1.3, 3, 5$の場合の処理結果である.

メディアンフィルタ (Median Filter)

カーネル窓$(2k+1) \times (2k+1)$を輝度順にソートし,そのソート後の中央値を平滑化済みの値として出力するフィルタカーネルのことをメディアンフィルタ (Median Filter)もしくは中央値フィルタ と呼ぶ.カーネルとの畳み込みではなく,カーネル内の輝度値のソート計算により平滑化を行うフィルタである(2.2節).

メディアンフィルタは,中央値ソートを行うことによって,外れ値ノイズであるスパイク状のごま塩ノイズ(Salt-and-pepper noise)の画素のみを滑らかにできる.ボックスフィルタやガウスフィルタのように隣接画素同士を滑らかにするカーネルで畳み込みを行ったりはしないので,画像のエッジを保存したまま平滑化を達成することができる.

3.2 鮮鋭化の画像フィルタ

鮮鋭化 (Sharpening)は,画像のエッジ部分のみをコントラストを強調することで,鮮やかで見やすい画像へ補正(enhancement)を行う処理である.

アンシャープマスキング

アンシャープマスクキング(Unsharp Masking)は,一番基本的な画像の鮮鋭化カーネルである.元画像を平滑化し非鮮鋭化させた(unsharp)画像の輝度値を元画像の輝度値に上乗せする演算により,ボケた輪郭を強調して元画像を鮮鋭化し,輪郭が見やすい画像に補正するフィルタである.AdobeフォトショップやGIMPなどの画像編集アプリを使用する場合に,ピンボケした画像をレタッチする際にお世話になる,基本的でよく用いられてきた鮮鋭化処理である.

アンシャープマスキングでは,まず前処理として,$I(\bm{p})$平滑化した画像$S(\bm{p})$から,残差画像 $ R(\bm{p}) = I(\bm{p}) – S(\bm{p})$を計算する.

そして,後半の処理では,任意のスケーリングを行なった残差画像を,入力画像$I$に加算することで,鮮鋭化が達成される:

\begin{equation}J(\bm{p}) = I(\bm{p}) + \lambda [I(\bm{p}) – S(\bm{p})] \\
= [1 + \lambda] I(\bm{p}) – \lambda S(\bm{p})\end{equation}

ここで,$\lambda>0 $は任意のスケーリングパラメータである.

3.3 基本的なエッジ検出 (edge detection) 向けの画像フィルタ

微分フィルタ:1次微分

最も単純な,隣接画像の微分値を計算する微分フィルタ(difference filter)がある.ディジタル画像の画素値は通常(0~255)で量子化されており,なおかつ座標値$(x,y)$は離散値である.従って,参照画像の両隣の値を元に,離散的な微分を行う演算子を用いる.

微分フィルタ x方向
図3(a) x方向の微分フィルタ.y方向の縦向きエッジを抽出. 
微分フィルタ y方向
図3 (b) y方向の微分フィルタ.x方向の横向きエッジを抽出. 

図3(a)は,微分フィルタのカーネルである.図3 (a)はy方向の縦向きのエッジを抽出できるx方向微分を行うカーネルであり,図3(b)は逆にx方向の横向きのエッジを抽出できるy方向微分を行うフィルタである.

Sobelフィルタ

微分を近似して実行し,画像フィルタを,ソーベルフィルタ(Sobel Filter)と呼ぶ (考案者のI. E. Sobel. の名前から).また,ソーベルフィルタのことを,かつてはエッジ検出器(Edge Detector)と呼んでいた.

以下,図4(a),(b)は,それぞれx方向微分とy方向微分のSobelフィルタである.

図4 (a) x方向の
Sobel フィルタ
図4(b) y方向の
Sobel フィルタ

微分フィルタの弱点は,1画素レベルなのでノイズに弱いところである.そこでSobelフィルタでは,ノイズ除去のための平滑化も,微分方向と直行する方向で行うことにより,ノイズに頑健な微分が実行できる.以下の図5は図4(a)のx方向微分のSobel フィルタが,2つのフィルタの掛け算で合成されて作成されていることを示したものである.

図5 Sobelフィルタの合成:「y方向の平滑化」と「x方向の微分方向」の合成.

Laplacianフィルタ:2次の偏微分

Sobelフィルタのように,2次の偏微分であるLaplacian(ラプラス演算子)の近似を利用したエッジ検出フィルタを,Laplacianフィルタと呼ぶ.Sobelフィルタによる1次の微分は,ノイズに弱い側面がある.従って,代わりに2次微分のゼロ交差をエッジ抽出として用いたい場合に,Laplacianフィルタなどの2次微分フィルタを使用する.

Laplacianフィルタは,ラプラス演算子をxの2次微分カーネルとy方向の2次微分の和として近似する:

$$ \nabla^2 I(\bm{p}) \approx I_x(\bm{p}) + I_y(\bm{p})$$

以下の図6が,$3\times 3$のLaplacianフィルタの例である:

ラプラシアンフィルタ 1
図6 (a) Laplacian フィルタ 例1
ラプラシアンフィルタ 2
図6 (a) Laplacian フィルタ 例2

Laplacianフィルタはラプラス演算子を近似したフィルタなので,方向に非依存なエッジを検出することができる.

4節 まとめ

この記事では,画像フィルタリングの空間ドメインで使用するカーネルのうち,単純なスライディングウィンドウ処理だけで済む基本的なもの(平滑化,鮮鋭化,エッジ検出)の主要なフィルタのみを紹介した.

この記事で紹介した基本的なフィルタ以外にも,画像処理では局所演算子で済む発展的な処理は多いので,それらは関連記事として別記事にまとめていきたい(Canny エッジ検出やHarrisコーナー検出にバイラテラルフィルタなど)

References

  • [1] R. Klette. CONCISE COMPUTER VISION: An Introduction Into Theory and Algorithms. Springer, 2019.

外部参照サイト

関連記事