DICOM:DICOM三大开源库对比分析之“数据加载”

背景:

上一篇博文DICOM:DICOM万能编辑工具之Sante DICOM Editor介绍了DICOM万能编辑工具,在日常使用过程中发现,“只要Sante DICOM Editor打不开的数据,基本可以判定此DICOM文件格式错误(准确率达99.9999%^_^)”。在感叹Sante DICOM Editor神器牛掰的同时,想了解一下其底层是如何实现的。通过日常使用以及阅读软件帮助手册推断其底层依赖库很可能是dcmtk,就如同本人使用dcmtk、fo-dicom、dcm4che3等诸多DICOM开源库遇到的兼容性问题类似,——dcmtk兼容性最强,fo-dicom次之,dcm4che3最差

问题:

本篇通过对比dcmtk3.6与dcm4che3.x解析同一特殊dicom文件包含非标准VR的元素)分析dcmtk、dcm4che以及fo-dicom数据加载的兼容性问题。
特殊的dicom文件内容如下:
28 00 20 01 20 20 02 00 30 F8,具体描述如下:

使用dcmtk与fo-dicom加载数据时都未出现错误,例如dcmtk加载数据时的提示如下:

由此可以看出dcmtk已经顺利识别出了非标准VR的元素(0028,0120),并成功加载。
虽然使用fo-dicom加载数据没有出现错误,但是对于上述非标准VR的元素(0028,0120)后的元素未顺利加载,如下图所示:

而dcm4che3加载过程中直接弹出了错误,如下所示:

问题分析:

出现该问题的原因是dcm4che3和fo-dicom在解析0028,0120元素时,对于20 20的非标准VR无法识别。下文中将通过分析dcm4che3与dcmtk的源码来定位问题的具体位置并给出解决方案(此处暂时只对比分析了dcm4che3.3.8最新版与dmctk3.6的源码,对于fo-dicom的源码分析待后续整理完成后再补充)

1. dcmtk3.6源码:

使用dcmtk编写本次数据加载测试工程,简单的示例代码如下:

int main()
{
    OFLog::configure(OFLogger::TRACE_LOG_LEVEL);
    char* ifname = "c:\\1.dcm";
    E_FileReadMode readMode = /*ERM_fileOnly*/ERM_autoDetect;
    E_TransferSyntax xfer =  EXS_Unknown;
    Uint32 maxReadLength = DCM_MaxReadLength;
    bool loadIntoMemory = true;
    DcmFileFormat dfile;
    DcmObject *dset = &dfile;
    if (readMode == ERM_dataset) dset = dfile.getDataset();
    OFCondition cond = dfile.loadFile(ifname, xfer, EGL_noChange, maxReadLength, readMode);
    if (cond.bad())
    {
        return 1;
    }
    return 0;
}

单步调试,可以知道dcmtk加载dicom文件的流程如下:

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
您好!我可以帮助您处理C#中的DICOM图像。DICOM(Digital Imaging and Communications in Medicine)是医学图像和相关信息的标准格式。 在C#中处理DICOM图像,您可以使用第三方来读取、修改和保存DICOM文件。以下是基本的步骤: 1. 安装DICOM:可以使用开源如`fo-dicom`或商业如`Leadtools`。您可以根据需求选择适合您的。 2. 读取DICOM文件:使用DICOM提供的API,您可以读取DICOM文件并将其到内存中。这样,您就可以访问和操作DICOM图像的像素数据、元数据和其他信息。 ```csharp // 使用fo-dicom读取DICOM文件 var dcmFile = DicomFile.Open("path/to/dicom/file.dcm"); var dcmDataset = dcmFile.Dataset; ``` 3. 访问图像数据:通过访问`PixelData`属性,您可以获取DICOM图像的像素数据。您可以使用这些数据进行处理、分析或显示。 ```csharp var pixelData = dcmDataset.GetPixelData(); // 处理像素数据 ``` 4. 修改和保存DICOM文件:根据您的需求,您可以修改DICOM图像的元数据或像素数据,并将其保存为新的DICOM文件。 ```csharp // 修改元数据 dcmDataset.AddOrUpdate(DicomTag.PatientName, "John Doe"); // 修改像素数据 dcmDataset.AddOrUpdatePixelData(pixelData); // 保存DICOM文件 dcmFile.Save("path/to/save/dicom/file.dcm"); ``` 请注意,DICOM图像处理涉及到医学领域和法律要求的敏感数据。在进行任何处理之前,请确保您遵守适用的法规和隐私政策。 希望这些信息对您有所帮助!如果您有任何其他问题,请随时提问。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zssure

己欲立而立人,己欲达而达人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值