|
目次ページへ 多ビット(10Bit、12Bitなど)の画像データは10Bitや12Bitの型が存在しないため、モノクロの場合はushort型の16bit中、下位10Bit、12Bitを使って画像データを格納します。 カラー10Bitの場合(RGB101010)は32Bit中の下位30Bitを使って画像データを格納します。
この××Bit中のどのビットをR,G,Bの色に割り振るかは、ビットフィールドというものを使います。 ビットフィールドを使うにはBITMAPINFOHEADERのbiCompressionをBI_BITFIELDSに設定します。 どのビットをR,G,Bの色に割り振るかはRGBQUAD型の32Bitを使って有効ビットを指定します。 bmiColors[0]がR(赤)、bmiColors[1]がG(緑)、bmiColors[2]がB(青)の色のビットを設定するのに用います。
実際の描画にはWin32APIのSetDIBitsToDevice関数かStretchDIBits関数を使います。 この表示のサンプルプログラムはVB6.0ですが、VB6.0でビットマップファイルを開くのページに置いておきました。 (純粋な.NET環境では多ビット画像を表示できそうにないので、.NETからAPI関数を呼び出せば 一応は表示できます)
■モノクロ画像の場合(10~16Bitのとき) (例)モノクロ10Bitの場合、biBitCount = 16 とし、16Bit中10Bitを使います。 表示に有効なビットを以下のように指定します。 | 画像データ | | | 00000011 | 11111111 | | bmiColors[0] | 00000000 | 00000000 | 00000011 | 11111111 | | bmiColors[1] | 00000000 | 00000000 | 00000011 | 11111111 | | bmiColors[2] | 00000000 | 00000000 | 00000011 | 11111111 |
以上より、bmiColorsを10進数で表示すると以下のようになります。
bmiColors[0].rgbReserved = 0; bmiColors[0].rgbRed = 0; bmiColors[0].rgbGreen = 3; bmiColors[0].rgbBlue = 255; bmiColors[1].rgbReserved = 0; bmiColors[1].rgbRed = 0; bmiColors[1].rgbGreen = 3; bmiColors[1].rgbBlue = 255; bmiColors[2].rgbReserved = 0; bmiColors[2].rgbRed = 0; bmiColors[2].rgbGreen = 3; bmiColors[2].rgbBlue = 255;
■カラー画像の場合(R10G10B10Bitのとき) (例)カラー10Bitの場合、biBitCount = 32 とし、32Bit中、下位30Bitを使います。 表示に有効なビットを以下のように指定します。 | 画像データ | 00111111 | 11111111 | 11111111 | 11111111 | | bmiColors[0] | 00111111 | 11110000 | 00000000 | 00000000 | | bmiColors[1] | 00000000 | 00001111 | 11111100 | 00000000 | | bmiColors[2] | 00000000 | 00000000 | 00000011 | 11111111 |
以上より、bmiColorsを10進数で表示すると以下のようになります。
bmiColors[0].rgbReserved = 63; bmiColors[0].rgbRed = 240; bmiColors[0].rgbGreen = 0; bmiColors[0].rgbBlue = 0; bmiColors[1].rgbReserved = 0; bmiColors[1].rgbRed = 15; bmiColors[1].rgbGreen = 252; bmiColors[1].rgbBlue = 0; bmiColors[2].rgbReserved = 0; bmiColors[2].rgbRed = 0; bmiColors[2].rgbGreen = 3; bmiColors[2].rgbBlue = 255;
■サンプル画像  画像データはこちら(右ボタン→対象をファイルに保存)からダウンロードできます。
【画像データプロパティ】 幅:1024 高さ:256 ビット数:16 BitField:16ビット中、下位10ビットの上位8ビットを表示設定 輝度値:0~1023のグラデーション
上記のビットマップファイルをTSXBINというバイナリエディタでヘッダ部分を表示すると以下の通りです。(値は16進数表示) 
エクプスローラのプロパティや標準的なビューアソフトでは16ビットとして認識されない場合が多いのでご注意下さい。
※この記事では10Bitなどの多ビット画像データを8Bitデータにシフト処理などする事なく、画像データを表示する方法を説明しています。実際のモニタ上にはRGB各8Bitの解像度で表示されます。 モニタ上にRGB各10Bitで表示するには、別途、10Bit対応のモニタ、ビデオカード、表示プログラム(Direct-X/OpenGL)が必要のようです。詳細は以下のページを参照下さい。
◆10ビット/8ビット表示はドコが違う!?:「FlexScan SX2462W」のDisplayPort入力で“約10億色リアル表示”を体感する (1/3) - ITmedia +D PC USER ◆株式会社エーキューブ - ナナオ社製10bit対応モニタ「Flexscan」「ColorEdge」による動作確認 ◆AMD(ATI)の資料 ◆nVIDIAの資料
こりゃ、ビデオカードもモニタも私には高価すぎて、私には当分評価できそうにありません...
最近のCCDカメラでは8Bitのみならず、10Bit、12Bitの出力を持つカメラが増えてきています。多ビットの画像データは低コントラストの画像データを処理するには有功な場合が多いのですが、ほとんどの画像処理ライブラリでは多ビットの画像データに対応していない場合が多いため、画像処理部分のプログラムを全て自作する必要が出てきます。 また、8Bitが10Bitになるだけで、カメラから画像入力ボードへのデータ転送量は倍(16Bit/画素)となるため、フレームレートやスキャンレートの最速レートを出せなくなる場合があります。 そのため、総合的に捉えて多ビットの画像データをお取り扱い下さい。
Loading...
スポンサーリンク
|