2016-10-25 73 views
1

我有一個RLE壓縮的DICOM文件,它具有PALETTE_COLOR光度解釋。使用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應用於緩衝區。我用這個代碼:

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,因爲我希望將LUT後的RGB像素。但結果圖像不正確。

如果我使用ImageApplyLookupTable類,我可以正確顯示圖像。

我不想使用ImageApplyLookupTable類,因爲它會將整個圖像(所有片段!)解碼爲原始RGB像素並消耗大量內存。我想逐幀解碼framge以最大限度地減少內存使用量。

你能指點我正確的方向,如何正確使用gdcm.LookupTable類來一次解碼一幀?我使用的示例文件是here.

更新:使用ImageRegionReader工作的8位PALETTE顏色,但沒有工作的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位PALETTE COLOR。 – Namrata

回答

0

GDCM附帶了一堆例子,在你的情況下,我建議你開始閱讀:ExtractImageRegionWithLUT.cs

該代碼是非常愚蠢的,因爲它會覆蓋前面提取的幀。但無論如何,這應該給你基本的想法。下面是我做在這裏:

首先確保你的C#的例子是構建(我用做在我的情況):

$ make GDCMCSharpExample 

則:

$ ExtractImageRegionWithLUT.exe PAL-16_RLE.dcm 

在UNIX上,這將創造原始文件,您可以使用gdcmimg轉換回DICOM:

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

然後,您可以SIMPL Ÿ查看:

$ 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