2011年3月21日月曜日

16 bit グレースケール

CT, MR, CR, DR などの医用画像は殆どが16bit グレースケール画像。
PCでは8bitしか表示できないので、これを変換。
また Bitmap.SetPixel がとても遅いため LockBits を使用。

using System;
using System.Drawing;
using System.Drawing.Imaging;
DICOMオブジェクト
int columns = dicomData.Columns;
int rows = dicomData.Rows;
int windowCenter = dicomData.WindowCenter;
int windowWidth = dicomData.WindowWidth;
ビットマップ
 1byteが1pixelのグレースケール用ColorPaletteを作成する。
 3byte=1pixelのグレースケール(R=G=B)より容量減か。

byte[] pixelData = dicomData.PixelData;Bitmap bitmap;
ColorPalette colorPalette;
for (int i = 0; i < 256; i++)
    colorPalette.Entries[i] = Color.FromArgb(i, i, i);
Bitmap bitmap = new Bitmap(columns, rows, PixelFormat.Format8bppIndexed);


データの挿入 ()
public unsafe Bitmap Grayscale16To8()

{

int padding = bitmapData.Stride - columns;

int min = windowCenter - windowWidth / 2;

int max = windowCenter + windowWidth / 2;

fixed (byte* pData = pixelData)

{

    int pixel;

    short* ptr = (short*)pData;

    byte* pBitmap = (byte*)bitmapData.Scan0;

    int j = 0, i = 0;

    for (int y = 0; y < _rows; y++)

    {

        j = y * _columns;

        for (int x = 0; x < _columns; x++)

        {

            pixel = (int)ptr[j + x];   

            if (pixel <= min)

                pixel = 0;

            else if (pixel >= max)

                pixel = 255;

            else

                pixel = (int)((pixel - min) * 255 / (max - min));

            pBitmap[i] = (byte)pixel;

            i++;

        }

        i += padding;

    }

}

bitmap.UnlockBits(bitmapData);

return bitmap;

}

0 件のコメント :

コメントを投稿