操作 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 字段。
如果写出的几个 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());