【发布时间】: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