我需要编写一个程序,将任何 .tiff 图像转换为 C++ 中的 .DCM。我正确实现了 DCMTK,但在我的解决方案中,我在转换后无法打开 .dcm :(
bool convertTiffToDicom(const std::string& tiffFilename, const std::string& dicomFilename) {
// TIFF-Bild laden
cv::Mat tiffImage = cv::imread(tiffFilename, cv::IMREAD_UNCHANGED);
if (tiffImage.empty()) {
std::cerr << "Fehler beim Laden des TIFF-Bildes." << std::endl;
return false;
}
// DICOM-Dataset erstellen
DcmFileFormat dcmFileFormat;
DcmDataset* dcmDataset = dcmFileFormat.getDataset();
// Größe des Bildes setzen
dcmDataset->putAndInsertUint16(DCM_Rows, tiffImage.rows);
dcmDataset->putAndInsertUint16(DCM_Columns, tiffImage.cols);
// Pixelwerte setzen
DcmElement* pixelData = nullptr;
dcmDataset->findAndGetElement(DCM_PixelData, pixelData);
if (!pixelData) {
pixelData = new DcmPixelData(DCM_PixelData);
dcmDataset->insert(pixelData, true);
}
pixelData->putUint16Array((Uint16*)tiffImage.data, tiffImage.rows * tiffImage.cols);
// Zusätzliche Metadaten hinzufügen (Beispiel)
dcmDataset->putAndInsertString(DCM_PatientName, "John Doe");
dcmDataset->putAndInsertString(DCM_PatientID, "12345");
// DICOM-Bild speichern
OFCondition status = dcmFileFormat.saveFile(dicomFilename.c_str(), EXS_LittleEndianExplicit);
if (status.good()) {
std::cout << "Konvertierung von TIFF zu DICOM erfolgreich abgeschlossen." << std::endl;
return true;
}
else {
std::cerr << "Fehler beim Speichern des DICOM-Bildes: " << status.text() << std::endl;
return false;
}
}
我可以确认阿米特·乔希斯的评论。您添加的属性太少,无法构成有效的 DICOM 对象。不,dcmtk 不会自动添加任何内容。
粗略地说,您应该首先决定对象的类型,然后遵循 DICOM 第 3 部分中的 IOD。我猜您会选择辅助捕获图像(对属性的要求非常低,所以这里是您的参考:辅助捕获 IOD
您至少需要添加 UID:SOP 类、SOP 实例、研究实例和系列实例。您可能很幸运找到一个可以显示图像的查看器,但它距离“符合 DICOM 标准”还很远
图像数据也不足以被观看者解读。例如。 DICOM 中有许多不同的颜色支持模型,因此其他属性变得很重要。请参阅图像像素模块了解所需内容。
您可能想查看 DCMTK 的 dcmiod 模块,而不是使用“原始”DICOM 数据集 (dcmdata) 接口。它提供了更方便的 API,为您提供有关如何构建有效的 DICOM 对象的更多指导。
我认为这些提示应该可以帮助您朝着正确的方向前进。属性及其值的完整列表太冗长了。 DICOM 不仅仅是一种图像格式。这是关于工作流程的。因此,像素数据只是构建 DICOM 对象时需要正确处理的许多重要方面之一。