怎样利用DCMTK工具包将图片(jpeg)转换成DICOM文件

1 引言

DICOM 工具包 (DICOM Toolkit, DCMTK) 自 1995 年推出以来,对任何使用医学数字成像和通信 (DICOM) 标准的系统工作者都很有帮助。这本 DCMTK 简介对首次探索 DICOM 的人以及熟悉 DICOM 但想重新了解 DICOM 工具的人都很有帮助。

DCMTK 是为各种平台开发的,由 20 多个开源 C/C++ 库和实用程序组成。DCMTK 由德国奥尔登堡信息研究所 OFFIS 赞助,并得到了许多欧洲组织和世界各地其他组织的支持。

DCMTK 或 DICOM 工具包是一种开源工具,可帮助用户跨不同平台与 DICOM 系统进行通信。它是实现 DICOM 标准部分内容的库和应用程序的集合。DCMTK 被医院和公司用于多种用途,包括 
故障排除: DCMTK 的中性输出有助于找出供应商之间问题的根源。
图像存储和工作列表服务器: DCMTK 可提供独立于供应商的中央图像存储和工作列表服务器。
产品测试: DCMTK 可用作产品测试工具。
研究项目: DCMTK 可用作研究项目的构建模块。
原型和商业产品: DCMTK 可用作原型和商业产品的构建模块。

因此学习使用DCMTK是一个不错的选择。假设您已经在自己的机器上安装好了DCMTK工具包,同时也有一个自己喜欢的IDE。

2 实践

本文的目标是创建一个小型示例应用程序,作为使用 DCMTK 库编程的入门。该示例由一个控制台应用程序组成,它将创建一个包含特定数据(DICOM文件的头部信息)和测试图像(普通的JPEG图像)的 DICOM 文件。实现此应用程序所需的信息可在 DCMTK 文档和 img2dcm 命令代码中找到。

2.1程序代码和解读

首先,要想使用DCMTK,就要先包含本项目所需要的头文件:

#include <iostream>

#include <dcmtk/config/osconfig.h>

#include <dcmtk/dcmdata/dcfilefo.h>

#include <dcmtk/dcmdata/dctk.h>

#include <dcmtk/dcmdata/libi2d/i2d.h> // Abstract class

#include <dcmtk/dcmdata/libi2d/i2djpgs.h> //instance

#include <dcmtk/dcmdata/libi2d/i2dplsc.h>

包含了必要的头文件后,我们就可以写我们的main函数了,在main函数中定义几个必要的变量和类的实例。

char uid[100];    
I2DImgSource* inputPlug=new I2DJpegSource();   
I2DOutputPlug* outputPlug=new I2DOutputPlugSC();  
Image2Dcm i2d; 
E_TransferSyntax writeXfer; 
DcmDataset* resultDataSet=NULL;

说明:

uid 将用于为 SOP 实例生成一个 uid。
inputPlug 是 I2DJpegSource 类型指针,它是 I2DImgSource 实现,用于解析 JPEG 图像并将其转换为 DICOM 文件。
outPlug 是 I2DOutputPlugSC 类型指针,用于实现图像到 DICOM 文件的转换。
i2d 是一个 Image2Dcm 类型的变量,其中包含将图像转换为 DICOM 文件的实用程序。
writeXfer 是一个 E_TransferSyntax 类型的变量,它包含了工具集已知的所有 DICOM 传输语法的枚举器。
resultDset 是一个 DcmDataset 类型的变量,它是一个处理 DICOM 数据集格式的类。

然后,我们使用I2DJpegSource中的setImageFile方法,设置需要转换的图片(jpeg格式)。同时利用Image2Dcm中的convert方法将图片封装在DcmDataset中,并且使用默认的字节序(小端字节序)。

inputPlug->setImageFile("../test.jpeg");

i2d.convert(inputPlug,outputPlug,resultDataSet,writeXfer);

仅仅有图片还不行,还需要填充DICOM文件的文件头。使用DcmDataset 对象中的方法对一个仅有图像的 DICOM 对象进行文件头的填充。这个 DcmDataset 类型的对象提供了一些用于设置其中数据的函数。使用这些函数,病人姓名、SOP 类别标识符和 SOP 实例标识符将与测试数据一起建立起来。

resultDataSet->putAndInsertString(DCM_PatientName,"Amy Laoren");

resultDataSet->putAndInsertString(DCM_SOPClassUID,UID_SecondaryCaptureImageStorage);

resultDataSet>putAndInsertString(DCM_SOPInstanceUID,dcmGenerateUniqueIdentifier(uid,SITE_INSTANCE_UID_ROOT));

这些函数的用法是,Dicom标签,和值Value的方式。SOPClassUID和SOPInstanceUID使用DCMTK中的工具进行生成。当然了,DICOM文件的文件头里面的DicmMetaInfo的内容是很多的,我们只是实现了一些必要的信息。

最后,只要我们使用DcmFileFormat类来进行输出,写盘就可以了。

DcmFileFormat fileFormat(resultDataSet);   
//这里直接使用DcmDataset来构建一个DcmFileFormat  fileFormat.saveFile("test.dcm",writeXfer,EET_ExplicitLength,EGL_recalcGL,EPD_noChange,OFstatic_cast(Uint32,0),                      OFstatic_cast(Uint32,0),EWM_fileformat);
至此,我们就完成了一个图片到Dicom文件的封装。你会在build目录下面生成了一个test.dcm文件。

文中需要的图片和生成的dicom文件在这里:

https://download.csdn.net/download/kangdehua/89793311

https://download.csdn.net/download/kangdehua/89793312

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值