ベイヤー色合成
[画像フィルタ]


説明

カラーカメラについて
bayercam.png
カラーカメラには大きく分けて三板式と単板式の2種類があります。 三板式のカメラは入ってきた光をダイクロイック・ミラー・プリズムによって波長別に分け、赤・青・緑をそれぞれ担当するCCDイメージセンサにあてて撮像します。 その結果、イメージセンサの全ての画素について赤・緑・青の輝度を個別に得ることができます。 一方、単板式では、カラーフィルタを通した光をイメージセンサでとらえます。 単板式カメラの各々の画素ではカラーフィルタに対応した輝度のみ得られるため、ある色のカラーフィルタがある画素では他の色の輝度を得ることができません。 各ピクセルで3種類全ての色の輝度が得られないとカラー画像にならないためそのままでは困ります。 (図の灰色部分。例えば青や赤のカラーフィルタがあるピクセルでは緑の値は得られません) そこで、撮像したベイヤーカラーフィルタ配列画像から周辺の画素を用いて値の得られない部分の補間を行います。これをベイヤー色合成やカラーデモザイキングと呼びます。
bcfa_ip.png
カラーフィルタの配置について
ベイヤー配列では赤:緑:青の比率が1:2:1になるように、また同色が隣り合わないように等間隔に配置します。 以下の図のように4種類の配置が考えられるため、ベイヤー色合成ライブラリでも対応したモードを指定することで処理可能にしました。
bcfa_mode.png
ベイヤーカラーフィルタ画像全体を処理する場合にはカメラ自体の仕様でモードが一意になります。 当ライブラリの低レベル関数では、奇数ピクセルを始点にしたチャイルド画像を対象に処理した場合、 その始点ピクセルの位置を基準にカラーフィルタの配置を設定することになるため画像全体とはモードが異なることに注意してください。 簡単に使うため、ルート画像のカラーフィルタの配置とチャイルド画像を入力してチャイルド画像のカラーフィルタの配置を求める関数が用意してあるほか、 上位関数である fnFIE_bayer_interpolation() では入力がチャイルド画像でもカラーフィルタの配置をルート画像の配置で入力する仕様になっています。
ベイヤー色合成の手法について
当ライブラリでは極めて単純な方法のみ実装しました。
  • 線形補間
  • 三次補間
  • 簡易な合成法
線形補間によるベイヤー色合成
RAW画像における座標(x,y)での濃度値をD(x,y)とし、出力画像における座標(x,y)での赤成分の濃度をR(x,y),緑成分の濃度をG(x,y),青成分の濃度をB(x,y)とします。
G(x,y)は以下のように求めます。

\[ {\renewcommand\arraystretch{1.5} G(x,y) = \left\{ \begin{array}{ll} D(x,y) & (*1) \\ \frac{1}{4}( D(x-1,y) + D(x+1,y) + D(x,y-1) + D(x,y+1) ) & (*2) \\ \end{array} \right. } \]

(*1) 座標x,yのカラーフィルタが緑のとき
(*2) それ以外のとき
これは、CFが緑であるピクセルのみ取り出した画像を作成し、以下のフィルタカーネルで畳み込んだのと同じです。

\[ {\renewcommand\arraystretch{1.5} \begin{array}{|c|c|c|} \hline 0 & \frac{1}{4} & 0 \\ \hline \frac{1}{4} & 1 & \frac{1}{4} \\ \hline 0 & \frac{1}{4} & 0 \\ \hline \end{array} } \]

R(x,y)は以下のように求めます。

\[ {\renewcommand\arraystretch{1.5} R(x,y) = \left\{ \begin{array}{ll} D(x,y) & (*3) \\ \frac{1}{2}( D(x-1,y) + D(x+1,y) ) & (*4) \\ \frac{1}{2}( D(x,y-1) + D(x,y+1) ) & (*5) \\ \frac{1}{4}( D(x-1,y-1) + D(x-1,y+1) + D(x+1,y-1) + D(x+1,y+1) ) & (*6) \end{array}\right. } \]

(*3) 座標 x,y のカラーフィルタが赤のとき
(*4) 座標 x,y のカラーフィルタが緑で、同じ行に赤のフィルタがあるとき
(*5) 座標 x,y のカラーフィルタが緑で、同じ行に青のフィルタがあるとき
(*6) 座標 x,y のカラーフィルタが青のとき
これは、CFが赤であるピクセルのみ取り出した画像を作成し、以下のフィルタカーネルで畳み込んだのと同じです。

\[ {\renewcommand\arraystretch{1.5} \begin{array}{|c|c|c|} \hline \frac{1}{4} & \frac{1}{2} & \frac{1}{4} \\ \hline \frac{1}{2} & 1 & \frac{1}{2} \\ \hline \frac{1}{4} & \frac{1}{2} & \frac{1}{4} \\ \hline \end{array} } \]

B(x,y)はR(x,y)と同様に求めます。
線形補間によるベイヤー色合成では出力画像の周囲1画素は出力されず、元の画素値が保持されます。

三次補間によるベイヤー色合成
RAW画像における座標(x,y)での濃度値をD(x,y)とし、出力画像における座標(x,y)での赤成分の濃度をR(x,y),緑成分の濃度をG(x,y),青成分の濃度をB(x,y)とします。
G(x,y)は以下のように求めます。

\[ {\renewcommand\arraystretch{1.2} G(x,y) = \left\{\begin{array}{ll}D(x,y) & (*7) \\ \frac{1}{256} \left[\begin{array}{c} -1 \\ 9 \\ 9 \\ -1 \end{array}\right]^T \left[\begin{array}{cccc} D(x,y-3) & D(x+1,y-2) & D(x+2,y-1) & D(x+3,y) \\ D(x-1,y-2) & D(x,y-1) & D(x+1,y) & D(x+2,y+1) \\ D(x-2,y-1) & D(x-1,y) & D(x,y+1) & D(x+1,y+2) \\ D(x-3,y) & D(x-2,y+1) & D(x-1,y+2) & D(x,y+3) \end{array}\right] \left[\begin{array}{c} -1 \\ 9 \\ 9 \\ -1 \end{array}\right] & (*8)\end{array}\right. } \]

(*7) 座標x,yのカラーフィルタが緑のとき
(*8) それ以外のとき

R(x,y)は以下のように求めます。

\[ {\renewcommand\arraystretch{1.2} R(x,y) = \left\{\begin{array}{ll} D(x,y) & (*9) \\ \frac{1}{16}(-D(x-3,y)+9D(x-1,y)+9D(x+1,y)-D(x+3,y)) & (*10) \\ \frac{1}{16}(-D(x,y-3)+9D(x,y-1)+9D(x,y+1)-D(x,y+3)) & (*11) \\ \frac{1}{256}\left[\begin{array}{c} -1 \\ 9 \\ 9 \\ -1 \end{array}\right]^T \left[\begin{array}{cccc} D(x-3,y-3) & D(x-1,y-3) & D(x+1,y-3) & D(x+3,y-3) \\ D(x-3,y-1) & D(x-1,y-1) & D(x+1,y-1) & D(x+3,y-1) \\ D(x-3,y+1) & D(x-1,y+1) & D(x+1,y+1) & D(x+3,y+1) \\ D(x-3,y+3) & D(x-1,y+3) & D(x+1,y+3) & D(x+3,y+3) \end{array}\right] \left[\begin{array}{c} -1 \\ 9 \\ 9 \\ -1 \end{array}\right] & (*12) \\ \end{array}\right. } \]

(* 9) 座標x,yのカラーフィルタが赤のとき
(*10) 座標 x,yのカラーフィルタが緑で、同じ行に赤のフィルタがあるとき
(*11) 座標 x,yのカラーフィルタが緑で、同じ行に青のフィルタがあるとき
(*12) 座標x,yのカラーフィルタが青のとき
B(x,y)もR(x,y)と同様に求めます。
三次補間によるベイヤー色合成では出力画像の周囲3画素は出力されず、元の画素値が保持されます。

簡易な合成法について
2x2のカラーフィルタを一つの撮像素子と考えて、縦横半分の出力画像を作成します。 青と赤の値は、出力座標を二倍して該当の入力座標を求め、最近傍の同色カラーフィルタでのデータを補間無しにそのまま採用します。 緑のカラーフィルタは2つありますが、上側もしくは下側の値のどちらかに決め、片方のみを補間無しにそのまま採用します。
出力画像の座標上では、どの色も入力画像で同色のカラーフィルタが存在した方向へ $\frac{\sqrt{2}}{4}$ pixelだけずれた画像となります。
処理例
bayersample.png
処理例を示します。左上が単板カラーカメラで撮像したCCD RAW 画像、右上が当ライブラリで色合成した結果です。 上段の画像の赤枠の中を拡大したものが下段の画像です。左下の画像からカラーフィルタの形を見ることができます。 右下の画像からは、平坦な領域で色が復元できていること、こまかなエッジ付近では偽色の出ることをみてとることができます。
参考文献:


モジュール

 低レベル関数

列挙型

enum  f_cfa_type {
  F_CFA_RGGB, F_CFA_GRBG,
  F_CFA_GBRG, F_CFA_BGGR
}
 ベイヤーカラーフィルタ配列タイプ [詳細]
enum  f_bayer_method {
  F_BAYER_BILINEAR, F_BAYER_CUBIC,
  F_BAYER_EASY
}
 ベイヤー色合成の手法 [詳細]

関数

INT FVALGAPI fnFIE_bayer_interpolation (const FHANDLE hsrc, FHANDLE hdst, enum f_cfa_type camera_cfa_type, DOUBLE gain[3], DOUBLE offset[3], enum f_bayer_method bayer_method)
 ベイヤー色合成 各種のベイヤー色合成を引数で手法選択して使用できます。
INT FVALGAPI fnFIE_bayer_simulation (FHANDLE hsrc, FHANDLE hdst, enum f_cfa_type cfa_type)
 カラー画像からbayer CFA画像の模擬生成を行います。

列挙型

enum f_cfa_type

ベイヤーカラーフィルタ配列タイプ

単板式カラーカメラの撮像素子におけるカラーフィルタ配列の種別

bcfa_mode.png
列挙型の値:
F_CFA_RGGB  左上が赤で右下が青のカラーフィルタ配列
F_CFA_GRBG  右上が赤で左下が青のカラーフィルタ配列
F_CFA_GBRG  右上が青で左下が赤のカラーフィルタ配列
F_CFA_BGGR  左上が青で右下が赤のカラーフィルタ配列

ベイヤー色合成の手法

列挙型の値:
F_BAYER_BILINEAR  線形補間によるベイヤー色合成
F_BAYER_CUBIC  三次補間によるベイヤー色合成
F_BAYER_EASY  簡易手法によるベイヤー色合成


関数

INT FVALGAPI fnFIE_bayer_interpolation ( const FHANDLE  hsrc,
FHANDLE  hdst,
enum f_cfa_type  camera_cfa_type,
DOUBLE  gain[3],
DOUBLE  offset[3],
enum f_bayer_method  bayer_method 
)

ベイヤー色合成 各種のベイヤー色合成を引数で手法選択して使用できます。

入力画像でホワイトバランスがとれていないときのためにゲインとオフセットを指定することができます。 色合成の結果に対し、ゲインを乗算しオフセットを加算した後、画像型に応じてサチュレーション処理を行って出力します。

入出力画像については以下の条件を満たす必要があります。また、入力の幅や高さが奇数の場合、出力画像では右や下の1画素を書きません。

  • 入出力の画像型は同じ
  • 色合成の手法が簡易ベイヤー色合成以外の場合、出力の画像サイズ幅と高さがいずれも入力と等しい
  • 色合成の手法が簡易ベイヤー色合成の場合、出力の画像サイズ幅と高さがいずれも入力の半分。 入力のサイズが奇数の場合、出力のサイズは(入力-1)/2

cfa_type は入力画像のカラーフィルタ配列タイプではなく、カメラ仕様のカラーフィルタ配列タイプを入力します。 入力画像が撮像したそのままのルート画像である場合は同じことですが、入力画像がカメラで撮像した画像の奇数座標から始まるチャイルド画像である場合、入力画像のCFAタイプとカメラのCFAタイプは異なります。 この関数では画像のCFAタイプではなくカメラのCFAタイプを入力してください。

bayer_method による出力画像の違い
  • F_BAYER_BILINEAR 線形補間によるベイヤー色合成。通常はこの手法を選択します。出力画像の周囲1画素は出力されず、元の値を保持します。
  • F_BAYER_CUBIC 三次補間によるベイヤー色合成。低速ですがエッジ付近のくっきりした出力が得られます。出力画像の周囲3画素は出力されず、元の値を保持します。
  • F_BAYER_EASY 簡易ベイヤー色合成。高速ですが得られる画像のサイズが小さく、偽色も大きく発生します。
引数:
[in] hsrc 入力画像 Bayer CFA 1ch RAW (type:uc8,s16,us16,double / ch:1)
[out] hdst 出力画像 3ch layerd color (type:uc8,s16,us16,double / ch:3 )
[in] camera_cfa_type カメラのカラーフィルタ配列タイプ
  • F_CFA_BGGR
  • F_CFA_RGGB
  • F_CFA_GRBG
  • F_CFA_GBRG
[in] gain 赤、緑、青のゲイン:通常は全て1.0
[in] offset 赤、緑、青のオフセット:通常は全て0.0
[in] bayer_method 色合成手法
  • F_BAYER_EASY 簡易ベイヤー色合成
  • F_BAYER_BILINEAR 線形補間によるベイヤー色合成
  • F_BAYER_CUBIC 三次補間によるベイヤー色合成
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM パラメータ異常
  • ゲイン、オフセットがNULL
  • cfa type が異常
  • 色合成手法が異常
F_ERR_INVALID_IMAGE 画像オブジェクト異常
  • 画像オブジェクトがNULL
  • 入力画像のチャネルが1ではない
  • 出力画像のチャネルが3ではない
  • 出力画像サイズが入力画像サイズに対応していない
  • 入出力の画像タイプが異なる
F_ERR_NOMEMORY メモリ不足で作業用画像が生成できない
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_bayer_simulation ( FHANDLE  hsrc,
FHANDLE  hdst,
enum f_cfa_type  cfa_type 
)

カラー画像からbayer CFA画像の模擬生成を行います。

cfa_typehsrc の左上を基準に適用します。

入出力の画像型、画像サイズは同じである必要があります。また、幅と高さは偶数でなければなりません。

引数:
[in] hsrc 入力画像 3ch layerd color (type:uc8,us16,s16,double / ch:3)
[out] hdst 出力画像 Bayer CFA 1ch RAW画像 (type:uc8,us16,s16,double / ch:1)
[in] cfa_type Bayer color filter arrayの配列タイプ
  • F_CFA_RGGB
  • F_CFA_GRBG
  • F_CFA_GBRG
  • F_CFA_BGGR
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_INVALID_IMAGE 画像オブジェクト異常
  • 画像オブジェクトがNULL
  • 出力画像のチャネルが1ではない
  • 入力画像のチャネルが3ではない
  • 入出力の画像サイズが異なる
  • 入出力の画像タイプが異なる
  • 画像の縦横幅が2の倍数ではない
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー


Documentation copyright © 2009-2023 FAST Corporation.
Generated on Fri Jan 13 11:09:33 2023 for FIEライブラリ by doxygen 1.5.6-FASTSP-p2