【问题标题】:Overwrite an image/pixel data in the dicom file using dcmtk使用 dcmtk 覆盖 dicom 文件中的图像/像素数据
【发布时间】:2016-03-01 01:12:50
【问题描述】:

我使用 dcmtk 读取 dicom 文件并将图像提取为 .tiff 格式。在进行了一些图像处理之后,我有一个图像,我想将其保存在源 dicom 文件中。这是用我的新图像/像素数据覆盖旧图像/像素数据,同时保留其余数据(uid、患者姓名等)一样。

我用下面的代码来读取dicom

OFCondition status = src_fileformat.loadFile(src_path);

    if (status.good())
    {
        Sint32 instanceNumber = 0;
        if (src_fileformat.getDataset()->findAndGetSint32(DCM_InstanceNumber, instanceNumber).good())
        {
            cout << "instance Number N: " << instanceNumber << endl;
            sprintf(instanceNum, "%d", instanceNumber);
            printf("%s\n", instanceNum);
        }

        else
            cerr << "Error: cannot access Instance Number!" << endl;
    }
    else
        cerr << "Error: cannot read DICOM file (" << status.text() << ")" << endl;

    src_dcm = new DicomImage(src_path);
    if (src_dcm != NULL)
    {
        if (src_dcm->getStatus() == EIS_Normal)
        {
            if (src_dcm->isMonochrome())
            {
                src_dcm->setMinMaxWindow();
                Uint8 *pixelData = (Uint8 *)(src_dcm->getOutputData(16 /* bits */));
                if (pixelData != NULL)
                {
                    src_dcm->writeBMP("source.tiff", 24);  /* do something useful with the pixel data */
                }
            }
        }
        else
            cerr << "Error: cannot load DICOM image (" << DicomImage::getString(src_dcm->getStatus()) << ")" << endl;
    }

图像处理后,我想将图像覆盖到此源 dicom 文件上。我查看了 image2dcm,但找不到正确的语法/方法。任何人都帮我.. :)

编辑-1

Image2Dcm i2d; 
I2DOutputPlug *outPlug = new I2DOutputPlugSC(); 
 I2DImgSource *inputPlug = new I2DJpegSource(); 
 E_TransferSyntax writeXfer; 
 inputPlug->setImageFile(jpgFile); 
DcmDataset *dataset = NULL; 
OFCondition result = i2d.convert(inputPlug, outPlug, dataset, writeXfer); 

   // Saving output DICOM image 
  if (result.good()) 
      { 
        dataset->putAndInsertString(DCM_PhotometricInterpretation,"RGB"); 

            DcmFileFormat dcmff(dataset); 
    result = dcmff.saveFile(dcmFile, writeXfer); 
       }

我尝试了上面显示的语法,但不能完全理解它

这是处理后的图像(上)

这是我要覆盖的原始 dicom 图像。伙计们,有什么想法或帮助吗??

【问题讨论】:

  • 你能展示一下你对image2dcm的尝试吗?
  • 我已经展示了我尝试过的语法...
  • 首先,获取源代码 sn-ps 并将它们复制在一起是行不通的(在您的情况下不是,但在一般情况下也不是)。您的示例代码对我没有任何意义。同样保留所有 UID 也不是一个好主意。我建议您清楚地指定输入数据是什么以及输出数据应该是什么,即您的处理步骤发生了什么变化。例如。您正在混合 BMP 和 TIFF 图像...您是否了解过 DICOM 像素数据格式?

标签: c++ opencv image-processing medical dcmtk


【解决方案1】:

基本做法应该是:

  1. 从文件中加载 DICOM 数据集
  2. 替换数据集中的像素数据
  3. 修改各种其他元素值(例如 SOP Instance UID)
  4. 将修改后的 DICOM 数据集保存到新文件中

在未压缩图像的情况下,可以按照与第三步相同的方式执行第二步,即在数据集上适当调用 putAndInsertXXX() 方法。当然,Pixel Data 属性的元素值应该是正确的 DICOM 格式。有关详细信息,请参阅DICOM standard 第 3 部分和第 5 部分。

【讨论】:

  • 我理解这种方法。第 1,3 和 4 步我可以做到。但它阻止了我的第 2 步。
  • 关于第 2 步:这就是我在答案中添加最后一段的原因。只需使用 putAndInsertUint8Array() 或 putAndInsertUint16Array() 将像素数据数组(在您的情况下为单色 8 或 16 位值)添加到 PixelData 元素。并且,请确保数组中的值与“0028”组中的其他 DICOM 元素值一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多