GDCM库无法在C#中读取dicom文件

时间:2016-09-22 10:56:36

标签: c# dicom gdcm

我尝试使用此代码使用GDCM库读取DICOM文件:

gdcm.ImageReader imagereader = new gdcm.ImageReader();
imagereader.SetFileName(@"E:\sample_success.dcm");
if (!imagereader.Read()) throw new Exception("Cannot read dicom file!");

对于“sample_success.dcm”文件,我可以正常读取文件(sample_success.png)。 但是使用“sample_failed.dcm”文件,GDCM会抛出异常,因为它无法读取它。我尝试使用其他DICOM查看器(如Radiant)打开文件,但它确实有效。我的GDCM版本有问题吗?为什么它看不懂呢?

我使用GDCM 2.6.5。请找到两个样本here.

1 个答案:

答案 0 :(得分:1)

您的文件包含偏移0x1480aa之后的垃圾(二进制0串)(在像素数据属性中的某处)。如果没有正确报告错误,您对工具包的期望是什么?

按照设计,GDCM仍会加载任何可能的内容,直到出错。因此,如果您删除代码中的new Exception,则可以决定(例如)将imagereader.GetFile()传递给gdcm::Writer并将文件重写为干净的DICOM。

作为旁注,我无法访问Radiant软件,但我觉得很奇怪,在这种情况下它并不表示错误。

我已经使用DCMTK和dicom3tools进行了检查,他们都报告了解析问题。

使用gdcm命令行工具,您几乎可以使用以下方法重写文件:

$ gdcmconv -I sample_failed.dcm sample_failed_correct.dcm

由于您的输入数据集无效,GDCM(错误地)相信会看到某个属性,您可以使用以下命令将其删除:

$ gdcmanon --dumb --remove 0,0 sample_failed_correct.dcm sample_failed_correct_clean.dcm

然后:

$ gdcminfo sample_failed_correct.dcm 
MediaStorage is 1.2.840.10008.5.1.4.1.1.3.1 [Ultrasound Multi-frame Image Storage]
TransferSyntax is 1.2.840.10008.1.2.4.50 [JPEG Baseline (Process 1): Default Transfer Syntax for Lossy JPEG 8 Bit Image Compression]
NumberOfDimensions: 3
Dimensions: (800,600,21)
SamplesPerPixel    :3
BitsAllocated      :8
BitsStored         :8
HighBit            :7
PixelRepresentation:0
ScalarType found   :UINT8
PhotometricInterpretation: YBR_FULL_422
PlanarConfiguration: 0
TransferSyntax: 1.2.840.10008.1.2.4.50
Origin: (0,0,0)
Spacing: (0.0106324,0.0106324,1)
DirectionCosines: (1,0,0,0,1,0)
Rescale Intercept/Slope: (0,1)
Orientation Label: AXIAL

哪个对像素数据中的碎片数有效:

$ gdcmdump sample_failed_correct.dcm | grep Item | grep "ff.d8" | wc
     21     126    2856