使用 C++ 中的 DCMTK 将 .TIFF 图像转换为 .DCM

问题描述 投票:0回答:1

我需要编写一个程序,将任何 .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;
    }
}
c++ tiff dicom dcmtk
1个回答
0
投票

我可以确认阿米特·乔希斯的评论。您添加的属性太少,无法构成有效的 DICOM 对象。不,dcmtk 不会自动添加任何内容。

粗略地说,您应该首先决定对象的类型,然后遵循 DICOM 第 3 部分中的 IOD。我猜您会选择辅助捕获图像(对属性的要求非常低,所以这里是您的参考:辅助捕获 IOD

您至少需要添加 UID:SOP 类、SOP 实例、研究实例和系列实例。您可能很幸运找到一个可以显示图像的查看器,但它距离“符合 DICOM 标准”还很远

图像数据也不足以被观看者解读。例如。 DICOM 中有许多不同的颜色支持模型,因此其他属性变得很重要。请参阅图像像素模块了解所需内容。

您可能想查看 DCMTK 的 dcmiod 模块,而不是使用“原始”DICOM 数据集 (dcmdata) 接口。它提供了更方便的 API,为您提供有关如何构建有效的 DICOM 对象的更多指导。

我认为这些提示应该可以帮助您朝着正确的方向前进。属性及其值的完整列表太冗长了。 DICOM 不仅仅是一种图像格式。这是关于工作流程的。因此,像素数据只是构建 DICOM 对象时需要正确处理的许多重要方面之一。

© www.soinside.com 2019 - 2024. All rights reserved.