1

私のカメラは14ビットのグレースケール画像を提供しますが、APIの関数は画像データにlong*を返します。(したがって、各ピクセルに4バイトを想定しています)

私のアプリケーションはC++/ CLIで書かれており、pictureBoxは.NETタイプです。
私は現在BitmapData.LockBits()、画像データへのポインタアクセスを取得するメカニズムを使用
memcpy(bmpData.Scan0.ToPointer(), imageData, sizeof(long)*height*width)
しており、画像データをビットマップにコピーするために使用しています。
現在、機能しているPixelFormatは32ビットRGBのみであり、画像は輪郭のある青の色合いで表示されます。

16bppGrayscaleとしてビットマップを初期化しようとしても機能しません。
理想的には、配列をロングからワードにキャストし、16ビット形式を使用したいと思います(14ビットデータが正しく表示されることを期待しています)が、これが機能するかどうかはわかりません。また、画像データを反復処理したくないので、最小/最大を見つけてから[0..255]までヒストグラムを拡大することは私には選択肢ではありません(表示は可能な限り効率的でなければなりません)

ありがとう

4

1 に答える 1

1

はい、それは非常に青く見えます。高輝度ピクセルの場合は緑の色合いがいくつかあります。ピクセル形式の不一致があります。32bppRgbには、青に1バイト、緑に1バイト、赤に1バイト、未使用のバイトが1バイトあります。グレー画像を直接コピーすると、最大6ビットの緑の青のバイトが設定されます。

16bppGrayScaleは、GDI +のみが実際にサポートしていれば、すばらしいでしょう。問題は、主流のビデオアダプタがこのフォーマットを処理しないことです。ピクセル値をRGBトリプレットに変換する必要があります。灰色に見えるようにするには、青、緑、赤のバイトを同じ値に設定する必要があります。14ビットを8ビットに圧縮する必要があるため、これは不可逆変換になります。それは実際には問題ではありません。人間の目は、16,384の異なるグレーレベルを区別できるほど十分ではありません。カメラが高輝度ピクセルに対して16383のピクセル値を生成すると仮定すると、ピクセル値を6だけ右シフトします。24bppRgbまたは32bppRgbピクセル形式のいずれかが機能します。後者は、intに適合し、ストライドでサルをする必要がないため、より高速になります。

偽色の画像も可能であることに注意してください。14ビットのグレー値を任意の色にマッピングできます。これを行う最も簡単な方法は、int[16384]マッピングテーブルを使用することです。表に固執するのは完全にあなた次第です。一般的なマッピングは、低強度の場合は濃い赤、高強度の値の場合は紫です。

画像表示にはこれで十分です。ただし、画像処理を行う場合は、おそらくカメラの解像度を利用することをお勧めします。ビットマップには近づかないようにする必要があります。LeadToolsのようなグラフィックライブラリベンダーをチェックしてください。

于 2010-05-17T12:45:52.563 に答える