我有一个RLE压缩DICOM文件,它有PALETTE_COLOR
光度学解释。使用GDCM,我可以使用以下代码获取片段:
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;
decodeBuffer大小为Width * Height * 3
,因为我在应用LUT后期望RGB像素。但结果图像不正确。
如果我使用ImageApplyLookupTable
课程,我可以正确显示图像。
我不想使用ImageApplyLookupTable
类,因为它会将整个图像(所有片段!)解码为原始RGB像素并消耗大量内存。我想逐帧解码framge以最小化内存使用。
您能否指出我如何正确使用gdcm.LookupTable
类来一次解码一个帧?我使用的示例文件是here.
更新:使用ImageRegionReader
用于8位PALETTE COLOR,但不能用于16位,你能检查一下原因吗?我有16位的样本here。
答案 0 :(得分:0)
GDCM附带了大量示例,在您的情况下,我建议您开始阅读:ExtractImageRegionWithLUT.cs。
代码非常愚蠢,因为它会在前一个提取的帧上反复写入。但无论如何,这应该给你基本的想法。这是我在这里做的:
首先确保你的C#示例是构建的(我在我的情况下使用make):
$ 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
然后您可以简单地查看它:
$ 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