ディベイヤ処理

カラーカメラの出力するRaw画像データの形式にBayerフォーマットというものがあります。この画像フォーマットをどのように変換して、現実の色に近づけたカラー画像として表示されるかを説明します。

概要

IC Imaging ControlにはRaw画像データをディベイヤ処理する機能を備えています。そしてその処理をコントロールするのはDeBayerTransformクラスライブラリリファレンス>クラス>DeBayerTransformというクラスです。この機能を使うにはカメラがRawデータをBayer形式で扱うBY8に対応していることが必要条件となります。いくつかのカメラはグレースケールのビデオフォーマット(e.g. Y800, RGB8 etc.)にしか対応していませんが、 カラーRawデータを出力します。なぜかというと、BayerフォーマットにおけるカラーRawデータはピクセルごとに一つの色情報しかないためです。(Rawカラーデータに関してより詳しい情報をお探しであれば、こちらのウェブサイト:www.theimagingsource.comの用語解説にてBayer camera をご覧ください。) この場合debayer処理はStdFilters.ftfモジュールからロードされるDeBayerフレームフィルタを使用して行われる必要があります。

自動ディベイヤ処理

BY8フォーマットが選択された場合、IC Imaging Control は画像データにディベイヤ処理を施します。
Grabber::getDeBayerTransformクラスライブラリリファレンス>クラス>Grabber>Grabber::getDeBayerTransform Methodメソッドにをコールしてディベイヤ処理をコントロールするオブジェクトを取得します。DeBayerTransform::isActiveクラスライブラリリファレンス>クラス>DeBayerTransform>DeBayerTransform::isActive Methodメソッドは自動ディベイヤ処理が有効かどうかをチェックするのに使用できます。ディベイヤオブジェクトについての詳細はDeBayerTransformクラスライブラリリファレンス>クラス>DeBayerTransformを参照してください。シンクでの自動ディベイヤ処理を無効にしたい場合は、シンクの作成時にeBY8クラスライブラリリファレンス>エニュメレーション>tColorformatEnumMEDIASUBTYPE_BY_8などのベイヤーフォーマットを指定する必要があります。ディスプレイでのディベイヤ処理をオフにする唯一の方法としてはディスプレイパスにフレームフィルタを挿入し、入力はベイヤーフォーマットのみ、出力はモノクロのフォーマットというようにします。このフィルタの役割は入力からデータをコピーしそのまま出力するだけです。フィルタの実装は以下の通りになります

// 変換されていないローのベイヤーデータを表示させるフィルタ
class CBayerRaw: public DShowLib::FrameFilterImpl<CBayerRaw>
{
public:
  CBayerRaw(){};
  ~CBayerRaw(){};
  static DShowLib::FilterInfo getStaticFilterInfo();

protected:
  virtual void   getSupportedInputTypes( FrameTypeInfoArray& arr ) const
  {
    // 唯一の入力フォーマットとしてローのベイヤーデータを指定
    arr.addFrameType( MEDIASUBTYPE_BY8 );
  }

  virtual bool   getTransformOutputTypes( const FrameTypeInfo& in_type, FrameTypeInfoArray& out_types ) const
  {
    // 出力フォーマットとしてY800を指定
    out_types.addFrameType( eY800, in_type.dim.cx, in_type.dim.cy );
    return true;
  }

  virtual bool    transform( const IFrame& src, IFrame& dest )
  {
    // 画像データをそのままコピーする
    memcpy(dest.getPtr(),src.getPtr(), dest.getFrameType().buffersize);
    return true;
  }
};

DShowLib::FilterInfo CBayerRaw::getStaticFilterInfo()
{
  // フィルタに名前を付ける
  static FilterInfo f = { L"BayerRaw" };
  return f;
} ;

フレームフィルタのインスタンスを作成しディスプレイパスに挿入すれば、ロー画像データをライブ表示させることができます。

// フレームフィルタのインスタンスを作成
CBayerRaw bayerRaw;

// ローベイヤーフォーマットを選択
m_Grabber.setVideoFormat("BY 8 (640x480)");

// ディスプレイパスにフレームフィルタを挿入
m_Grabber.setDisplayFrameFilters( &bayerRaw );

// 何らかの処理を実行

// 終了次第、ディスプレイパスからフレームフィルタを取り除く
m_Grabber.setDisplayFrameFilters( 0 );

// これでフィルタオブジェクト'bayerRaw'はなくなります。

フレームフィルタの詳細についてはフレームフィルタ技術関連項目>フレームフィルタフレームフィルタを記述する: 2値化プログラマーズガイド>フレームフィルタの記述: 二値化処理をご参照ください。

明示的ディベイヤ処理

ディベイヤ処理を明示的に画像ストリームに適用するにはまずStdFilter.ftfモジュールよりDeBayerフレームフィルタをロードします。そしてそれを画像ストリーム上の任意の場所に挿入し、フィルタのパラメータがベイヤーパターンと処理アルゴリズムにマッチするように設定します。

//  std_filters.ftfモジュールよりDeBayerフィルタをロードする
#ifdef _DEBUG
  smart_com<IFrameFilter> pFilter = FilterLoader::createFilter( "DeBayer",   // フィルタ名
                               "stdfiltersd.ftf" ); // モジュールファイル

#else
  smart_com<IFrameFilter> pFilter = FilterLoader::createFilter( "DeBayer",   // フィルタ名
                               "stdfilters.ftf" ); // モジュールファイル

#endif
  pFilter->setParameter( "Start Pattern", 2 /* eGR */ );
  pFilter->setParameter( "Mode", 1 /* Bilinear */ );
  m_Grabber.setDeviceFrameFilters( pFilter.get() );