2016-10-25 13 views
1

私は測光の解釈を持つRLE圧縮DICOMファイルを持っています。 GDCMを使用して、次のコードを使用してフラグメントを取得できます。DICOMファイルのGDCMを使用してLUTを適用してください

gdcm.ImageReader imagereader = new gdcm.ImageReader(); 
imagereader.SetFileName(fileName); 
if (imagereader.Read()) 
    { 
    DataElement compressedPixelData = imagereader.GetFile().GetDataSet().GetDataElement(Helper.PIXEL_DATA); 
    SequenceOfFragments sf = compressedPixelData.GetSequenceOfFragments(); 
    if (sf == null) throw new Exception("Cannot get fragments!"); 
    Fragment frag = sf.GetFragment((uint)frameNumber); 
    uint bufLen = Convert.ToUInt32(frag.GetByteValue().GetLength().toString()); 
    byte[] buffer = new byte[bufLen]; 
    frag.GetByteValue().GetBuffer(buffer, bufLen); 
    } 

バッファからイメージを作成しようとしています。それはPALETTE_COLORなので、バッファにLUTを適用する必要があります。私はLUTを適用した後のRGBピクセルを期待するため

gdcm.LookupTable lut = imagereader.GetImage().GetLUT(); 

int size = ImageWidth * ImageHeight * 3; 
byte[] decodedBuffer = new byte[size]; 

bool worked = lut.Decode(decodedBuffer, (uint)size, buffer, (uint)bufLen); 

if (worked) 
    return decodedBuffer; 
else 
    return buffer; 

decodedBufferサイズがWidth * Height * 3である:私はこのコードを使用します。しかし、結果の画像は正しくありません。

ImageApplyLookupTableクラスを使用すると、画像を正しく表示できます。

ImageApplyLookupTableクラスは、画像全体(すべてのフラグメント!)を生のRGBピクセルにデコードし、多くのメモリを消費するため、使用したくありません。フレームごとにフレームをデコードして、メモリ使用量を最小限に抑えたい。

gdcm.LookupTableクラスを正しく使用して、フレームを一度に正しくデコードする方法を教えてください。私が使用したサンプルファイルはhere.

です。更新:8ビットパレットカラーの場合はImageRegionReaderを使用しましたが、16ビットでは機能しませんでしたが、なぜチェックすることができますか?私は16ビットのサンプルhereを持っています。

+0

あなたは[ExtractImageRegionWithLUT.cs](http://gdcm.sourceforge.net/2.6/html/をチェックする必要がありますExtractImageRegionWithLUT_8cs-example.xhtml) – malat

+0

@malat - 私のアップデートを参照してください、それは8ビットで動作しましたが、16ビットではありません。 – rg11

+0

上記の例では、decodedBuffer配列は適切ではありません。すべての配列値はゼロになります。私は8ビットパレットカラーで作業しています。 – Namrata

答えて

0

GDCMにはいくつかの例がありますが、あなたの場合、私はあなたが読むことをお勧めします:ExtractImageRegionWithLUT.cs

コードは、前のフレームよりも上に抽出されたフレームを何度も上書きするので、かなり愚かです。しかし、とにかくこれはあなたに基本的な考えを与えるはずです。ここで私はこっちやったことです:

まず、あなたのC#の例では、ビルドされていることを確認してください(私は私の場合にはmakeを使用):その後、

$ make GDCMCSharpExample 

$ ExtractImageRegionWithLUT.exe PAL-16_RLE.dcm 

UNIXでは、これが作成されます。あなたがgdcmimgを使用してDICOMに戻って変換することができRAWファイル、:

$ gdcmimg --depth 16 --spp 3 --size 800,600 /tmp/frame_rgb.raw /tmp/frame_rgb.raw.dcm 

あなたはその後、SIMPLすることができますyがそれを見る:

$ gdcmviewer /tmp/frame_rgb.raw.dcm 

をあなたも自分を納得させるために、以下を使用することができます。

$ gdcmimg -C 1.2.840.10008.5.1.4.1.1.3.1 --depth 16 --spp 3 --size 800,600 /tmp/frame_rgb.raw /tmp/frame_rgb.raw.dcm 
+0

申し訳ありませんが、今は16ビットで動作しました。以前は値を16ビットから24ビットに再計算するのを忘れていました。私の視聴者は24ビットしかサポートしていません。 – rg11

関連する問題