フラットフィールドコレクション(FFC)

フラットフィールドコレクションとは?

フラットフィールドコレクション(Flat Field Correction【略: FFC】)とは、撮影した画像の輝度値を均一にする補正で、比較的高価な工業用のカメラに搭載され、主にラインセンサカメラには、このフラットフィールドコレクションの機能が搭載されています。

 

そもそも、真っ白な被写体を撮影した時に、なぜ撮影した画像の輝度値が均一にならないのか?と言うと、考えられる要因として

 

  • レンズのシェーディングによる影響
  • 照明の明るさのムラ
  • CCD素子1つ1つの感度のばらつき

 

などが挙げられます。

 

フラットフィールドコレクションを行うと、これらの要因をまとめて補正する事が可能となります。

 

   
フラットフィールドコレクション前 フラットフィールドコレクション後

 

このフラットフィールドコレクションは、カメラのアナログオフセット(足し算/引き算)、アナログゲイン(掛け算/割り算)、デジタルオフセット(足し算/引き算)、デジタルゲイン(掛け算/割り算)を駆使して輝度値が均一になるように補正されます。
多少、実際の補正手順が面倒なので敬遠されがちですが、補正アルゴリズムを理解すると、ある程度、納得できると思います。

 

補正アルゴリズム

カメラにより実際の処理は異なる部分があると思いますが、おおむね以下の流れでフラットフィールドコレクションは行われます。

 

まず、最初にフラットフィールドコレクションによる輝度値の補正により、輝度値が飽和しない(輝度値が255を超えない)ようにするため、画像の最大輝度値が、おおむね255の80%程度(204ぐらい)になるように、実際の撮影する環境(照明、露光時間など)においてアナログゲインを調整します。

 

 

上図を見ても分かるように、画素のよっては入力光量が小さい場合(暗い場合)、出力輝度値が0になってしまう画素がある可能性があります。

 

これを補正するため、入力光量を0にして(レンズにキャプをする)、アナログオフセットで画像の最小輝度値が0にならないように調整します。

 

 

この状態で、カメラの黒レベル補正(FPN)の機能を実行すると、カメラ内部では、黒レベル(輝度値0)において、各画素の輝度値が0になるようデジタルオフセットの値が調整されます。

 

 

次に実際の撮影状態(照明、露光時間など)にして、できるだけ反射や汚れ、ムラの少ない白の被写体を撮影し、カメラの白レベル補正(PRNU)の機能を実行します。

 

すると、上記の撮影状態で全画素が指定した目標輝度値(輝度値を指定できないカメラもある)になるように、カメラ内部では全画素のデジタルゲインの値が調整されます。

 

 

この一連の処理を行う事で、最初に紹介したように、画像全体が均一な輝度値となる画像を得る事が可能となります。

 

また、上記の説明は、以下の順序でゲイン/オフセットの補正が行われる事を前提に説明しています。

 

CCDの電気信号アナログオフセットアナログオゲインデジタルオフセットデジタルゲイン

 

この機能は、主に二値化処理を用いた処理による画像検査などにおいては、効果を発揮します。

ロバスト推定法(Tukey’s biweight)

ロバストとは?

ロバスト(Robust)という言葉を辞書で調べると、「頑健なさま、がっしりした様子」という意味が載っています。

 

画像処理的には、ノイズや影、明るさの変動などの影響を受けにくく、安定した処理結果が得られる、ぐらいの意味として捉えれば良いでしょう。

 

ロバスト推定法

通常の最小二乗法では下図のように、数点の大きな誤差が含まれるだけでも、近似した直線が大きくズレてしまう場合があります。
この誤差の影響をできるだけ受けないようにしたのが、ロバスト推定法です。

 

処理アルゴリズム

まずは最初に、通常の最小二乗法を行います。
(今回は簡単にするため一次式で近似する例で紹介します。)

 

直線の式(y=ax+b)で近似する場合は以下のように行列を用いて解くことができます。

 

この近似した直線から遠く離れたデータを除去するだけでも、大きな誤差のデータの影響を受けなくなりそうですが、ここでは、誤差の大きさに応じて重みを付けるTukeyのBiweight推定法という手法を紹介します。

 

近似データ(Xi、Yi)と近似直線との誤差 d=Yi – (aXi + b) を用いて、誤差が大きければ大きいほど、
最小二乗に与える影響力(重み)が小さくなるように、以下のような式を用いて重み計算します。

 

d < -Wの場合

-W <= d <= Wの場合

W < dの場合

 

ただし、大文字のは誤差の許容範囲を示します。

 

この重みの関数w(d)をグラフで示すと、このようになります。

 

 

上図を見ても分かるように誤差の絶対値がWを超えると重みが0となり、次に行う重み付き最小二乗法では近似に影響を与えなくなり、逆に誤差が0に近づく程、重みが増し、近似への影響が大きくなります。

 

この重み wi を各近似データ(Xi、Yi)に関して計算し、wiを付加した最小二乗法を再度行います。

 

 

こうして求めた近似式(y = a’X + b’)は最初に求めた近似式よりも、測定データに近づきます。
この処理を誤差の許容範囲()を小さくしながら、誤差が少なくなるまで繰り返すことで、より測定データに近づいた近似式を得ることができます。

 

今回の例では一次式について示していますが、他のn次式などについても、同様に行列の各要素に重みを付加することで、ロバスト推定を行うことができます。

 

参考文献

 

使える数学へ戻る

 

最小二乗法の最適化(高速化)

最小二乗法を用いて曲線近似するとき、近似するX座標の値が等間隔に並んでいる場合、奇関数、偶関数の特性を使って最小二乗法を高速に処理することが可能になります。

 

例えば、画像中の線の中心位置や、エッジの位置をサブピクセル単位で求める場合などに有効です。

 

 

以下からは線の輝度値を2次曲線で近似して、線の中心を求める例を示します。

 

X方向の輝度値が最大となる座標付近の輝度値を抜き出し、2次式で近似すると
X座標が180と181との間に最大値がありそうな事が分かります。

 

 

この輝度値を二次式(Y = aX2 + bX + c)で近似する場合、下記の行列の式を解くと二次式が求まります。

 

 

ここで、逆行列の中は奇関数、偶関数の集まりなので、輝度値データのX座標を中心座標(X = 180.5)で割り振ると

 

 

となります。
よって、奇関数、偶関数の特性から、行列の式は

 

 

となり、行列の計算量を減らすことができます。

 

また、近似するデータの個数が固定できるなら、逆行列の部分はあらかじめ計算しておく事ができるので、さらに計算量を減らすことができます。

 

これで、求める線の中心座標は近似曲線の頂点位置、つまり微分の値が0となる座標(Y’ = 0の座標)なので、

線の中心座標 = Xの中心座標 – b / 2a
(今回の例ではXの中心座標 = 180.5)

 

となり、より高速に線の中心座標を求めることができるようになります。

 

この前提条件とした『X座標の値が等間隔に並んでいる場合』という部分ですが、画像処理においては、画素のX座標、Y座標を用いて、輝度値に関して近似する場合が多いので、for文などで、ある関数の総和などを求める場合には、この奇関数・偶関数が使えないか?検討してみると良いと思います。

 

このテクニックは計算量が格段に少なくなるので、効果的な場合が多いと思います。

 

使える数学へ戻る

 

最小二乗法をExcelで解く

エクセルではグラフの機能で近似曲線の追加というのはありますが、任意の式で近似したい場合や、近似式の係数を取得したい場合にはエクセルの近似曲線の機能だけでは物足りない場合があります。
そんなときにエクセルでまじめに最小二乗法で解く方法を紹介します。

 

まずは、最小二乗法を解くとき、逆行列を用いるところまではご理解願います。
詳しくはこちらで紹介しています。

 

最小二乗法
一般式による最小二乗法

 

また、Excelで行列を計算する方法はこちらを参照下さい。

 

行列の積、逆行列、転置行列の計算

 

以下では円の最小二乗法を例にとって説明をしたいと思います。

 

円の最小二乗法を解くときの円の一般式を

 

X2 + Y2 + AX + BY + C = 0

 

としたときの行列の式は

 

 

です。
まず、行列の式に使われているの値を求めます。
はエクセル関数の「SUM」関数を用いればよいので、簡単に求まります。

 

 

まず、行列の式の各値を各セルに書いておきます。
次に逆行列を求めるのですが、エクセル関数に「MINVERSE」というのがあります。

 

逆行列を表示したい複数のセル(下記の例では3×3のセル)を選択します。
次に

 

=MINVERSE(逆行列を求める複数のセル)

 

と入力します。ここでは文字を入力するだけでEnterキーは押さないこと

 

 

 

で、次が最大のポイント!
通常ではEnterキーを押したいところですが、行列の計算では

 

Ctrlキー  + Shiftキー + Enterキー

 

を同時に押します。
これで、逆行列の値が求まります。

 

 

あとは行列の積が計算できれば、求めたいA,B,Cの値を求めることができるのですが、
行列の積の計算にはエクセル関数の「MMULT」という関数を用います。

 

逆行列を計算したときと同様に行列の積の結果を表示したいセル複数のセルを選択し、

 

=MMULT(行列1,行列2)

 

を入力します。ここでも最後はEnterキーだけではなく

 

Ctrlキー  + Shiftキー + Enterキー

 

を押すので注意して下さい。

 

 

これで求めたかった未知数A,B,Cが求まります。

 

 

今回は円の近似なので、A,B,Cの値を用いで円の中心座標(a,b)、円の半径rを求めるには

 

a = -A / 2
b = -B / 2
r = SQRT(a2 + b2 – C)

 

なので、

 

 

となり、円の近似式を求めることができます。

 

このエクセルによる円の最小二乗法のファイルはこちら↓

LSM_Circle.xls

 

また、一般的なn次式による最小二乗法を解いたのファイルはこちら↓

n_LeastSquare.xls

 

使える数学へ戻る

 

CVKaleidoscope

今回はちょっと息抜き。

ネタ的には、よくある話なのですが、OpenCVのアフィン変換のおさらいも含めて、USBカメラを使った万華鏡ソフトを作ってみました。

 

USBカメラから取得した画像から、三角形領域を切り出し、回転、ミラー反転などを行って、万華鏡っぽくしています。

 

ファイルのダウンロードはこちら↓より

CVKaleidoscope230x86.zip

 

【開発環境】

●Visual Studio 2010 C++

●OpenCV2.3 x86 (32bit版)

 

上記の環境があれば、おそらく動作すると思います。

USBカメラは最初に見つけたカメラから640×480サイズで画像を取得しています。

 

【操作方法】

画像上で

Sキーで三角形の回転が開始/停止します。

その他のキーでプログラムが終了します。

 

作ってみると、思いの他、細かいバグにハマって苦労してしまいました...