将itkImage另存为DICOM时未写入图像位置/方向

时间:2016-11-07 10:25:03

标签: c++ dicom itk gdcm

我的3D体积为itkImage<unsigned char, 3>,并希望将其保存为DICOM系列。保存系列目前为止,但元数据标签“Image Position Patient”和“Image Orientation Patient”未保存在dicom文件中。所有其他标签都已正确保存。

如果我将元数据字典打印到控制台,则会正确打印这些标签。当我打开ITK-SNAP中的文件时,这两个标签都会丢失。

  

0010 | 0010病人

     

0010 | 0020 12345

     

0020 | 0032 0 \ 0 \ 0

     

0020 | 0037 1 \ 0 \ 0 \ 0 \ 1 \ 0

这是代码中将这些标记存储在元数据中的部分。我用一个工作示例创建了一个gist

UC3ImageType::PointType position;
UC3ImageType::IndexType index;
index[0] = 0;
index[1] = 0;
index[2] = f;
image->TransformIndexToPhysicalPoint(index, position);
value.str("");
value << position[0] << "\\" << position[1] << "\\" << position[2];
itk::EncapsulateMetaData<std::string>(*dictionary, "0020|0032", value.str());
value.str("");
value << position[2];
itk::EncapsulateMetaData<std::string>(*dictionary, "0020|1041", value.str());

itk::EncapsulateMetaData<std::string>(*dictionary, "0020|0037", "1\\0\\0\\0\\1\\0");

这段代码有什么问题?是否还需要其他标签,以便保存这些标签?

1 个答案:

答案 0 :(得分:3)

我可以通过指定不同的SOP类UID来解决问题。默认情况下,它使用Secondary Capture IOD并将其更改为Ultrasound Multi Frame,这也更适合我的图片。现在正确存储图像方向/位置。

const std::string SOP_CLASS_UID = "0008|0016";
const std::string US_MULTIFRAME_UID = "1.2.840.10008.5.1.4.1.1.3.1";
itk::EncapsulateMetaData<std::string>(*dictionary, SOP_CLASS_UID, US_MULTIFRAME_UID);

然而,对我而言,仍然很奇怪,当由于某种原因未保存元数据标签时没有警告或异常。