使用dcmtk覆盖dicom文件中的图像/像素数据

时间:2016-02-25 10:55:00

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

我使用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,但我无法获得正确的语法/方法。任何人帮助我.. :)

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

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

This is the processed image

这是已处理的图像(上图)

Original dicom image

这是我要覆盖的原始dicom图像。伙计们,任何想法或帮助??

1 个答案:

答案 0 :(得分:1)

基本方法应该是:

  1. 从文件
  2. 加载DICOM数据集
  3. 替换数据集中的像素数据
  4. 修改各种其他元素值(例如SOP实例UID)
  5. 将修改后的DICOM数据集保存到新文件
  6. 在未压缩图像的情况下,第二步可以以与第三步相同的方式执行,即通过在数据集上适当调用putAndInsertXXX()方法。当然,Pixel Data属性的元素值应该是正确的DICOM格式。有关详细信息,请参阅DICOM standard第3部分和第5部分。