イメージバッファにアクセスする - Y16 -

Y16は16bitのグレイスケールフォーマットです。イメージバッファのピクセルは左から右へ、上から下へと組織されます。

メモリーレイアウト

すべてのピクセルは符号なしの16bit整数値で、little-endianで格納されています。一般にカメラ自体は10bitか12bitまでしか対応していませんが、この場合の残りのbitsの中身については保証されません。

ピクセルデータの読み込み、書き込みの方法

ここでその動作を示すため、まずは画像取り込みデバイス、ビデオフォーマット、 FrameSnapSinkクラスライブラリリファレンス>クラス>FrameSnapSinkを準備します。 以下のコードはY16のピクセルデータにどようにアクセスし、操作するのかを順番に説明しています。
まず最初に、イメージバッファ内には何もありませんので、画像をキャプチャしなければなりません。そのためにライブ 表示を開始し、FrameSnapSink.SnapSingleクラスライブラリリファレンス>クラス>FrameSnapSink>FrameSnapSink.SnapSingel Methodを呼び出し、GrabImageメソッドによってこれを行います。

バッファにアクセスする

イメージバッファのデータにアクセスするために、まずは16bitの符号なし整数データとして取得する必要があります。System.Runtime.InteropServices.Marshal.ReadInt16を使用することによりヘルパー関数のReadY16が使えます。

[C#]
private unsafe UInt16 ReadY16(TIS.Imaging.IFrameQueueBuffer buf, int row, int col)
{
    // Y16 は上 から下に配列されています。最初のラインのインデックスは0です。
    int offset = row * buf.FrameType.BytesPerLine + col * 2;
    return (UInt16)System.Runtime.InteropServices.Marshal.ReadInt16(new IntPtr(buf.Ptr), offset);
}

このサンプルでは、最初(左上側)の2ピクセルを取得します。

[C#]
UInt32 val0 = ReadY16(buf, 0, 0);
UInt32 val1 = ReadY16(buf, 0, 1);
txtOutput.Text = "Image buffer pixel format is Y16\r\n";
txtOutput.Text += "Pixel 1: " + val0 + "\r\n";
txtOutput.Text += "Pixel 2: " + val1;

イメージデータの操作

関数WriteY16をイメージデータの輝度値の書き込みに使用します。

[C#]
private unsafe void WriteY16(TIS.Imaging.IFrameQueueBuffer buf, int row, int col, UInt16 value)
{
    int offset = row * buf.FrameType.BytesPerLine + col * 2;
    System.Runtime.InteropServices.Marshal.WriteInt16( new IntPtr( buf.Ptr ), offset, (short)value);
}

ここで画像中の左上にある3ピクセルに対して、黒、グレー、白を書き込みます。

[C#]
WriteY16(buf, 0, 0, 0x0000); // Black
WriteY16(buf, 0, 1, 0x8000); // Gray
WriteY16(buf, 0, 2, 0xFFFF); // White
TIS.Imaging.FrameExtensions.SaveAsTiff( buf, "y16.tiff");

結果を確認するために、保存されたイメージの左上を確認してください。以下の様になっているはずです。