将 itkImage 保存为 DICOM 时未写入图像 Position/Orientation

Image Position/Orientation not written when saving itkImage as DICOM

我有一个 3D 体积 itkImage<unsigned char, 3> 并想将其保存为 DICOM 系列。到目前为止保存该系列作品,但元数据标签 "Image Position Patient" 和 "Image Orientation Patient" 未保存在 dicom 文件中。所有其他标签都已正确保存。

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

0010|0010 Patient

0010|0020 12345

0020|0032 0[=13=][=13=]

0020|0037 1[=13=][=13=][=13=][=13=]

这是将这些标签存储在元数据中的代码部分。我用一个工作示例创建了一个 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");

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

我可以通过指定不同的 SOP Class UID 来解决问题。默认情况下它使用 Secondary Capture IOD and I changed it to Ultrasound Multi Frame,这也更适合我的图像。现在图像 Orientation/Position 已正确存储。

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);

然而,对我来说仍然很奇怪,无论出于何种原因未保存元数据标签时,都没有警告或异常。