6 空間フィルタリング
産業用カメラを静止した均一に照らされたグレーボードに向け、連続して2フレームの画像を取得して減算すると、差分が0にならないことがわかる。各画素は微小な範囲でランダムに変動する。これが画像ノイズである。センサーの暗電流と読み出し回路、照度不足を補うために高められたアナログゲイン、電源リップルによる照明の変動、さらにはレンズや保護ガラス上のほこりなどに起因する。研究室ではこれらの摂動は大した問題にならないかもしれないが、生産ラインではノイズは後続のアルゴリズムの基盤を直接揺るがす。エッジ位置検出はノイズ箇所で偽の応答を生じ、閾値処理では細かい斑点が多数発生し、サブピクセル計測の繰り返し精度は悪化する。そのため、空間フィルタリングは位置検出と計測の前にほぼ常に最初に行われる工程であり、画素の近傍で適切な「平均化」を行い、ランダムな摂動を抑えつつ、真に関心のある構造をできるだけ保持する。
本章では、すべての実験に1つの合成テストシーンを用いる。均一な明るい背景上に暗い矩形(ステップエッジを提供)があり、その上方に幅2画素の細い輝線(傷やボンディングワイヤなどの微細構造を模擬)がある。図 6.1 に元のシーンと、2種類の代表的なノイズを重畳した様子を示す。
6.1 画像ノイズモデル
適切なフィルタを選ぶには、まずノイズの性質を明らかにする必要がある。マシンビジョンで最も一般的なモデルは加算性ガウシアンノイズである。観測画像 \(g\) は真の画像 \(f\) にランダムな摂動が加わったものとなり、
\[ g[n,m] = f[n,m] + \eta[n,m], \qquad \eta \sim \mathcal{N}(0, \sigma^2). \]
各画素は汚染されるが、その量は通常大きくなく、大部分の摂動は \(\pm 2\sigma\) の範囲に収まる。物理的な起源はセンサーの暗電流ノイズ、読み出しノイズ、増幅ゲインによって生じる電子ノイズである。これらの要因は多数の微小かつ独立した摂動の重ね合わせであり、中心極限定理によりその合計はガウス分布に収束する。図 6.1 (b) はまさにこの状況を示しており、画像全体が「毛羽立って」いるが、完全に破壊された画素はない。
もう1つの一般的なノイズは塩胡椒ノイズ(パルスノイズとも呼ばれる)である。少数の画素がランダムに最小値(「胡椒」、0)または最大値(「塩」、255)に置き換えられ、残りの画素は完全に影響を受けない。その起源にはセンサーの不良画素、カメラと産業用PC間の伝送エラー、強い反射表面での鏡面反射によって生じる孤立した過曝光点などがある。図 6.1 (c) の点在する黒と白の点は典型的な塩胡椒ノイズであり、汚染された画素は真の値とは全く関係がなく、誤差の大きさはグレースケール全体の範囲に達することがある点に注意されたい。
なぜ2種類のノイズには異なるフィルタが必要なのか?ガウシアンノイズは「誰もが少しずつ間違っている」状態なので、近傍を平均化することで誤差を相殺できる。塩胡椒ノイズは「少数が極端に間違っている」状態なので、平均化すると極端な値が隣接画素に拡散してしまう。正しい対処法は外れ値を除去することであり、これがまさにメディアンフィルタが行うことである。
これら2つのモデルの違いは単なる数学的な興味にとどまらず、フィルタの選択を直接決定する。ガウシアンノイズの場合、各画素の観測値は「おおよそ正しい」ので、近傍内の値を平均化すると独立したゼロ平均の誤差が相殺され、推定値が改善する。線形フィルタが自然な選択肢となる。塩胡椒ノイズの場合、汚染された画素は「誤差を含む情報」ではなく純粋なゴミであり、ゴミを平均に含めると元々クリーンだった隣接画素まで汚染してしまう。必要なのは外れ値を識別して除去できる非線形な手法である。本章後半の実験でこの点が繰り返し確認される。
6.2 線形フィルタと畳み込み
線形空間フィルタリングの統一的な数学的形式は畳み込みである。入力画像 \(f\) と小さな重みテンプレート(カーネルと呼ばれる)\(h\) が与えられたとき、出力画像は
\[ g[n,m] = \sum_{k,l} f[n-k,\, m-l]\, h[k,l]. \]
直感的には、\((n,m)\) における出力値は、その点を中心とする小さな入力近傍とカーネルの重みの加重和である。カーネルがフィルタの特性全体を決定する。
最も単純なカーネルは平均フィルタカーネルであり、\(K\times K\) のウィンドウ内の各重みが \(1/K^2\) に等しい。例えば \(3\times 3\) の平均カーネルは
\[ h = \frac{1}{9} \begin{bmatrix} 1 & 1 & 1\\ 1 & 1 & 1\\ 1 & 1 & 1 \end{bmatrix}. \]
係数の前の正規化係数に注意されたい。カーネルの全重みの和はフィルタの直流ゲインと呼ばれる。重みを正規化して和を1にすると、一定のグレースケール値を持つ画像をフィルタリングしても元のまま出力され、画像の平均輝度が変化しない。これは計測用途で特に重要である。フィルタリングによって全体のグレースケール値が意図せず上下すると、グレースケールの閾値やグレースケールの補間に依存する後続のすべてのアルゴリズムに影響が及ぶ。
平均カーネルはウィンドウ内のすべての画素を等しく扱うのに対し、ガウシアンフィルタは距離に応じて重みを減衰させ、中心から遠い画素ほど出力への影響が小さくなる。
\[ h[n,m] = \frac{1}{2\pi\sigma^2}\exp\!\Big(-\frac{n^2+m^2}{2\sigma^2}\Big). \]
パラメータ \(\sigma\) は平滑化の空間スケールを制御する。\(\sigma\) が大きいほど、平均化に関与する有効な近傍が広くなり、ノイズ除去効果が強まるが、画像はよりぼやける。平均カーネルと比較すると、ガウシアンカーネルは周波数応答が単調減少してサイドローブのリンギングがなく、平滑化効果がより「クリーン」であるため、線形ノイズ除去の標準的な選択肢となっている。離散的な実装では、連続ガウス関数をサンプリングした後、サンプル値の和で除算して直流ゲインが正確に1になるようにする。
実用上、さらに2つのエンジニアリング上の要点がある。1つ目はカーネルサイズを \(\sigma\) に一致させることである。ガウス関数は理論上は無限に広がるが、\(3\sigma\) を超えると振幅は中心値の約1%になるため、通常 \(K \approx 6\sigma\)(最も近い奇数に丸める)で打ち切る。\(\sigma=1.2\) の場合は \(7\times 7\) 程度のカーネルで十分である。カーネルが小さすぎるとガウス関数の「肩」が削られ、大きすぎると計算が無駄になる。2つ目はガウシアンカーネルは分離可能であることである。2次元ガウス関数は1次元水平ガウス関数と1次元垂直ガウス関数の積に正確に等しいため、1回の2次元畳み込みを、まず水平1次元畳み込みを行い、次に垂直1次元畳み込みを行うように分割でき、結果は完全に同一となる。
分離可能性の利点:\(K\times K\) の2次元カーネルでは1画素あたり \(O(K^2)\) 回の乗算加算が必要だが、2つの1次元カーネルに分割すると \(O(2K)\) 回で済む。\(K=7\) の場合は49対14、\(K=15\) の場合は225対30であり、カーネルが大きいほど削減効果が大きい。商用のビジョンライブラリのガウシアンフィルタの内部実装はほぼすべてこの方式である。
6.3 非線形フィルタ
線形フィルタには避けられない制限がある。「ノイズ」と「エッジ」を区別できないことである。両者は高周波成分であるため、前者を抑圧すると必然的に後者も鈍化する。非線形フィルタは加重平均の枠組みを超えることで、線形手法にはできない能力を獲得する。
メディアンフィルタはこのファミリーの中で最も重要なものである。加重和を計算する代わりに、ウィンドウ内の画素値をソートし、中央値を出力とする。
出力画像の各画素 (n, m) に対して:
(n, m) を中心とする K×K 近傍内のすべての画素値を取得
これらの値を昇順にソート
出力 ← ソートされたリストのちょうど中央の値(中央値)
中央値は外れ値に対して本来的に耐性がある。ウィンドウ内に0または255の不良画素が少数混入しても、それらが半数に満たない限り、ソートによってリストの両端に追いやられ、出力に選ばれることはない。これがまさに塩胡椒ノイズの克星である。さらに、メディアンフィルタがステップエッジを横切るとき、ウィンドウ内の過半数の画素はエッジの片側に属するため、出力はその側の代表値を直接取り、エッジは鋭いまま保たれ、線形フィルタのように遷移帯が引き延ばされることはない。その代償については実験の節で明らかにする。
バイラテラルフィルタ(Tomasi と Manduchi 1998) は「エッジ保存」の思想を加重平均の枠組みに導入したものである。各近傍画素 \(\mathbf q\) に割り当てる重みは2つのガウス因子の積となる。
\[ g[\mathbf p] = \frac{1}{W_{\mathbf p}} \sum_{\mathbf q \in S} G_{\sigma_s}\!\big(\|\mathbf p-\mathbf q\|\big)\; G_{\sigma_r}\!\big(|f[\mathbf p]-f[\mathbf q]|\big)\; f[\mathbf q], \]
ここで \(W_{\mathbf p}\) は重みの和(直流ゲインを1に保つため)、\(G_{\sigma_s}\) は空間領域のガウス関数、\(G_{\sigma_r}\) はグレースケール領域(range)のガウス関数である。直感は非常に明確である。近傍画素が出力に影響を与えるには、2つの条件を同時に満たす必要がある——近くにある(空間ガウス関数が高い重みを与える)かつ類似している(グレースケール値が中心画素に近く、グレースケールガウス関数が高い重みを与える)ことである。平坦な領域では近傍画素のグレースケール値が類似しているため、バイラテラルフィルタは通常のガウス平滑化に縮退し、ノイズが効果的に抑圧される。エッジ付近では、反対側の画素はグレースケール値の差が大きいため、グレースケールガウス関数がそれらの重みをほぼゼロに抑え、平均化はエッジの同じ側でのみ行われるため、エッジはそのまま保持される。\(\sigma_r\) は「同じ仲間」の境界を定める。グレースケール値の差が約 \(2\sigma_r\!\sim\!3\sigma_r\) 未満の近傍画素は平均化に参加し、それを超えるものは「反対側」と見なされて除外される。
6.4 実験比較
では4種類のフィルタを同じ条件で比較しよう。まずガウシアンノイズ(図 6.1 (b))下での性能を見る。4種類のフィルタリング結果を 図 6.2 に示す。
平均フィルタとガウシアンフィルタはいずれも粒子感を明らかに平坦化し、「平均化が独立した誤差を相殺する」原理を確認している。代償も同様に明らかである。矩形のエッジは灰色の遷移帯に引き延ばされ、幅2 pxの細い輝線も暗く太くなっている。これはその輝度が周囲の背景画素に拡散されたためである。両者を比較すると、同じカーネルサイズではガウシアンフィルタの方がエッジの劣化がわずかに少ない。これは重みが中心に集中している結果である。メディアンフィルタは矩形のエッジを非常に鋭く保持するが、細い輝線に注目されたい。それはほとんど消えている——この現象についてはすぐに別途議論する。最もバランスの取れた性能を示したのはバイラテラルフィルタである。背景のノイズは平滑化され、矩形のエッジは鮮明なままで、細い輝線も完全に保持されている。これは線と背景のグレースケール値の差(約70グレースケールレベル)が \(\sigma_r=30\) の「同じ仲間」の閾値をはるかに超えており、線上の画素は線上の画素同士でのみ平均化されるためである。ガウシアンノイズに対しては、バイラテラルフィルタがエッジ保存ノイズ除去の最良の選択肢である。
塩胡椒ノイズ(図 6.1 (c))に切り替えると、結論はほぼ完全に逆転する。図 6.3 を参照されたい。
平均フィルタとガウシアンフィルタの結果は期待外れである。パルスは消えず、引き延ばされてしまう。0または255の各不良画素はその極端な値をウィンドウ全体に拡散し、直径約5 pxの薄いまたは濃い柔らかいしみに変わり、画像全体がかえって汚らしく見える。一方、メディアンフィルタは圧倒的に優れている。黒と白の不良画素は一斉に除去され、背景は均一に戻り、矩形のエッジは鋭いまま保たれ、結果は元の画像に近いほどクリーンである。これは セクション 6.1 の末尾の主張の視覚的な裏付けである——外れ値に対しては、平均化するのではなく除去すべきである。
最も記憶に留めるべきはバイラテラルフィルタの性能である。それは塩胡椒ノイズに対してほぼ無効である。 図 6.3 (d) と 図 6.1 (c) を比較すると、不良画素はほぼ元の位置に残っている。理由は謎ではないが、誤解されることが多い。値255の塩点は周囲のグレースケール値約180の背景と75グレースケールレベルの差があり、\(\sigma_r=30\) の類似性閾値をはるかに超えている。そのためバイラテラルフィルタの目には、この不良画素は「特異な小さな構造」と映り、周囲の画素はいずれも「同じ仲間」と見なされないため、自分自身とのみ平均化され、当然元の値を保持する。バイラテラルフィルタのエッジ保存機構が、まさにパルスノイズの盾となってしまうのである。 塩胡椒ノイズに遭遇したら、迷わずメディアンフィルタを選ぶべきである。
ただしメディアンフィルタにも代償がある。図 6.3 (c) と 図 6.2 (c) を 図 6.1 (a) の元画像と再度比較してほしい。幅2 pxの細い輝線が両方のメディアンフィルタの結果で消えている。理由は不良画素が除去されるのと全く同じである。5×5のウィンドウ内では、細線は最大で \(2\times 5=10\) 画素しか寄与せず、25画素の半数に満たないため、ソート後に中央値の位置を占めることは決してなく、「やや大きなノイズ」として除去されてしまうのである。メディアンフィルタはエッジを保存するが微細構造は保存しない。ウィンドウの半分の幅より狭い線状または点状の構造は、ノイズであれ真の対象であれ、一律に消去される。ここから厳しい制約が導かれる。メディアンカーネルのサイズは、保持すべき最小の構造の幅(の2倍)より小さくなければならない——細線の幅が2 pxであれば、3×3のメディアンカーネルならばまだ細線を残せるが、5×5ではノイズと一緒に消去されてしまう。フィルタは「欠陥」と「ノイズ」を区別できず、サイズしか認識しないのである。
6.5 SciVision 実装
本章の4種類のフィルタは SciVision SDK の SCIMV::SciSvFilter クラスによって提供され、以下のように呼び出す。
SCIMV::SciSvFilter f;
SciImage dst;
f.Mean(src, roi, &dst, 5, 5);
f.Gaussian(src, roi, &dst, 5, 5, 1.2, 1.2);
f.Median(src, roi, &dst, 5, 5);
// Bilateral(カーネル直径9, 空間σ=3.0, グレースケールσ=30.0):グレースケール値の差が約3σを超える近傍の重みはゼロに近づくため、エッジが保存される
f.Bilateral(src, roi, &dst, 9, 3.0, 30.0);これらのインターフェースの共通パラメータのうち、src は入力画像、roi は処理領域を限定し(生産ラインのプログラムは通常、時間を節約するため検査領域のみをフィルタリングする)、dst は出力を受け取る。フィルタ固有のパラメータは以下の通りである。
Mean/MedianのkernelSizeX、kernelSizeY(上記の例ではいずれも5)はそれぞれウィンドウの幅と高さであり、ウィンドウに中心を持たせるため奇数でなければならない。両者は異なっていてもよく、例えば平たい(9, 3)のウィンドウを用いて水平な筋状ノイズを選択的に抑圧できる。Gaussianはウィンドウサイズに加えてsigmaX、sigmaY(上記の例ではいずれも1.2)を受け取り、これらは水平方向と垂直方向のガウス標準偏差である。セクション 6.2 の一致則を覚えておこう。ウィンドウの一辺は約 \(6\sigma\) とするのが適切であり、上記の例の \(\sigma=1.2\) に5×5を組み合わせるのはややタイトな打ち切りであるが、エンジニアリング上は許容できる。Bilateralの3つのパラメータは順にkernelSize(近傍の直径、上記の例では9)、space_sigma(空間領域の \(\sigma_s\)。「近くにある」のスケールを制御する。上記の例の3.0は直径9とともに、\(d\approx 3\sigma_s\) という一般的な比率を満たす)、color_sigma(グレースケール領域の \(\sigma_r\)。「類似している」の閾値を制御する。上記の例の30.0は、約90を超えるグレースケール値の差を持つ近傍の重みがゼロに近づくことを意味するため、70レベル以上のステップエッジはほぼ完全に保持される)である。
本章のすべての実験画像を生成する完全な実行可能プロジェクトは code/spatial_filtering/ にあり、読者はノイズ強度とフィルタのパラメータを変更して、自ら結果を再現できる。
産業事例:金属部品の傷検出における前処理
ある金属プレス部品の検査プロジェクトでは、サンドブラスト加工されたワークの表面に多数の孤立した高輝度反射点が生じ、その統計的性質はソルト・ペッパーノイズに近かった。当初はガウシアンフィルタで前処理を行っていたが、反射点が薄い灰色の軟らかい斑点に引き伸ばされ、傷と区別することが難しく、誤検出率が高かった。3×3のメディアンフィルタに変更したところ、反射点はきれいに除去され、傷のエッジは鮮鋭に保たれたため、誤検出率は大幅に低下した。その後、「最適化」としてメディアンカーネルを7×7に拡大したところ、ラインで細い傷の見逃しが発生するようになった——傷の幅はわずか2~3画素で、ウィンドウの半分の占有率に満たないため、ノイズとして除去されてしまったのである。これは本章の細輝線実験を現場で再現したようなものである。経験則としては、カーネルはノイズの粒子径の2~3倍とし、かつ最小欠陥幅の2倍を超えてはならない。両者が矛盾する場合は欠陥の保持を優先し、残留するノイズは後段の面積によるスクリーニングに委ねる。
6.6 まとめ
本章の要点は以下のように要約できる。
- まずノイズを見極めてからフィルタを選ぶ。 ガウシアンノイズは「全員に生じる小さな誤差」であり、平均化型の線形フィルタに適している。ソルト・ペッパーノイズは「一部に生じる大きな誤差」であり、メディアンフィルタのような除去型の手法で対処する必要がある。
- 線形フィルタのカーネルは直流利得1に正規化すべきであり、これにより画像の平均輝度が保たれる。ガウシアンカーネルは \(K\approx 6\sigma\) で打ち切り、分離可能性を利用して計算量を \(O(K^2)\) から \(O(2K)\) に削減する。
- バイラテラルフィルタ = 空間的な近さ × グレースケール値の類似度による二重の重み付け であり、ガウシアンノイズ下でのエッジ保存型ノイズ除去の最良の選択肢である。ただし孤立したインパルスは「エッジ」として保護されるため、ソルト・ペッパーノイズに対してはほとんど効果がない。
- メディアンフィルタはエッジを保持するが微細構造は保持しない:ウィンドウの半分の占有率に満たない細い線や小さな点はノイズとともに消去されるため、カーネルサイズは保持すべき最小構造の幅の2倍を超えてはならない。
- フィルタのパラメータは測定精度の一部である:カーネルサイズや \(\sigma\) の大きさは、ノイズのスケールと最小の対象サイズに基づいて決定すべきであり、「大きければ大きいほどきれいになる」というものではない。
空間フィルタの理論体系(線形フィルタ、統計的順序フィルタ、およびそれらと周波数領域との関連)については、Gonzalez と Woods の古典的な教科書 (Gonzalez と Woods 2018) を参照されたい。バイラテラルフィルタの原初的な構成は Tomasi と Manduchi の論文 (Tomasi と Manduchi 1998) に記されており、本章本文でも複数回引用している。また、エッジ保存平滑化の代表的な先進的手法である異方拡散は、Perona と Malik の研究 (Perona と Malik 1990) に端を発する。産業検査のパイプラインにおける平滑化フィルタについて、より体系的な解説を求める場合は Steger らの著作 (Steger, Ulrich, と Wiedemann 2018) をさらに参照されたい。










