4

Grassroots DICOM (GDCM) ライブラリを使用して、単純な C++ アプリケーションで DICOM ファイルに含まれる画像のピクセル値を読み取ろうとしています。ファイルのメタデータを読み取ると、画像に関する次の情報が得られます。

Bits allocated: 16
Bits Stored: 16
High Bit: 15
Unsigned or signed: 1
Samples pr pixel: 1
Dimensions: 2
Dimension values: 256x256
Pixel Representation: 1
SamplesPerPixel: 1
ScalarType: INT16
PhotometricInterpretation: MONOCHROME2
Pixel buffer length: 131072

画像の解像度が 256x256 で MONOCHROME2 タイプであることを考えると、ピクセル バッファーの長さは 256x256=65536 要素になると予想していましたが、実際には 131072 要素の長さです。

代わりに MATLAB を使用してピクセル データをインポートすると、0 ~ 850 の範囲で正確に 65536 の値が得られます。0 は黒、850 は白です。

C++ アプリケーションで GDCM の読み出しから取得したピクセル バッファーを見ると、ピクセル バッファーは 131072 要素で、偶数のインデックス要素はすべて -128 から +127 の範囲にあり、奇数のインデックス要素はすべて 0 から 3 の範囲にあります。このような:

Exerpt:    

PixelBuffer[120] = -35
PixelBuffer[121] = 0
PixelBuffer[122] = 51
PixelBuffer[123] = 2
PixelBuffer[124] = 71
PixelBuffer[125] = 2
PixelBuffer[126] = 9
PixelBuffer[127] = 2
PixelBuffer[128] = -80
PixelBuffer[129] = 2
PixelBuffer[130] = 87
PixelBuffer[131] = 3
PixelBuffer[132] = 121
PixelBuffer[133] = 3
PixelBuffer[134] = -27
PixelBuffer[135] = 2
PixelBuffer[136] = 27
PixelBuffer[137] = 2
PixelBuffer[138] = -111
PixelBuffer[139] = 1
PixelBuffer[140] = 75
PixelBuffer[141] = 1
PixelBuffer[142] = 103 

この値の配置は何を意味するのでしょうか? これは、モノクロ画像の典型的なピクセル表現ですか? 私は「画像のピクセル構造をググる」などを行ってきましたが、探しているものが見つかりません。この値の配置と各ピクセルとの相関関係を理解するのに役立つリソースはありますか?

4

1 に答える 1

1

このコードを使用して、16 ビットの MONOCHROME2 Dicom ファイルを読み取ります。

byte[] signedData = new byte[2];
        List<int> tempInt = new List<int>();
        List<ushort> returnValue = new List<ushort>();

        for (i = 0; i < PixelBuffer.Length; ++i)
        {
            i1 = i * 2;
            signedData[0] = PixelBuffer[i1];
            signedData[1] = PixelBuffer[i1 + 1];
            short sVal = System.BitConverter.ToInt16(signedData, 0);

            int pixVal = (int)(sVal * rescaleSlope + rescaleIntercept);

            tempInt.Add(pixVal);
        }

        int minPixVal = tempInt.Min();
        SignedImage = false;
        if (minPixVal < 0) SignedImage = true;

        foreach (int pixel in tempInt)
        {
            ushort val;
            if (SignedImage)
                val = (ushort)(pixel - short.MinValue);
            else
            {
                if (pixel > ushort.MaxValue) val = ushort.MaxValue;
                else val = (ushort)(pixel);
            }

            returnValue.Add(val);
        }
于 2016-10-25T10:01:13.583 に答える