我有一個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。
您應該檢查[ExtractImageRegionWithLUT.cs](http://gdcm.sourceforge.net/2.6/html/ ExtractImageRegionWithLUT_8cs-example.xhtml) – malat
@malat - 看到我的更新,它適用於8位,但不適用於16位,任何線索? – rg11
在上面給出的例子decodedBuffer數組不正確。所有數組值都是零。我正在使用8位PALETTE COLOR。 – Namrata