Skip to content

操作 dcm 标签

BlogDemo/ITK/operation_dcm_tag

1.1 读写

  • itk::ImageFileReader 读取 dcm
  • itk::ImageFileWriter 保存 dcm
  • itk:MetaDataObject 获取字典

测试数据来自 TCIA,抹除了很多信息 debug 模式下 itk:: ImageFileWriter 保存时候会报很多 gdcm 的断言错误,可以忽略。

1.2 无法修改 UID

工作时遇到的一个问题,需要自己构建一系列 DICOM 文件,鼓捣了半天发现生成的 DICOM 的序列 id 都是在写出的时候随机生成的。

  • ITK 的 itk::ImageFileWriter
  • VTK 的 vtkDicomImageWriter

上边两个其实都是使用 GDCM 的 gdcm:: pixmapWriter,这玩意好像加了个强制的保护,无法修改 DICOM 文件属性。即使在写入过程中,将 DICOM 文件作为输入传入,输出文件也可能不包含输入文件中的所有 DICOM 字段。

GDCMImageIO

如果写出的几个 ID 无法修改,那么其他软件在读取的时候肯定不会当成一个系列,也没办法做后续操作。

也许 ITK 有专门修改 ID 的办法,我是没找到。换个思路,试了下 DCMTK 默认可以修改/添加所有的标签,不需要额外的设置。

最后实现的办法,利用 opencv 和 itk 现成的方法生成并保存需要的序列影像(DICOM 文件)。让后用 DCMTK 强制修改几个需要的 ID。

        DcmFileFormat fileformat;
        OFCondition oc = fileformat.loadFile(in_path.toLocal8Bit().data());
        fileformat.getDataset()->putAndInsertString(DCM_SeriesInstanceUID,
                           "1.2.840.113619.2.292.65140653520588659061.1552006679.1484.33");
        fileformat.getDataset()->putAndInsertString(DCM_StudyInstanceUID,
                           "1.2.840.113619.2.292.65140653520588659061.1552005022.1480.86");
        fileformat.getDataset()->putAndInsertString(DCM_SOPInstanceUID,
                           "1.2.840.113619.2.205.114374079573872.178409.1552386274354.14");
        fileformat.saveFile(out_path.toLocal8Bit().data());