DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改
来源:互联网 发布:win10怎么重置网络配置 编辑:程序博客网 时间:2024/06/06 00:35
dcm文件是医学领域DICOM3.0标准所对应的主要的文件格式。前两篇学习笔记中,学习了读取dcm文件的相关信息,如信息头MetaInformation元素、像素数据元素,只停留在了读取和显示dcm文件的阶段,随着学习的深入,自己开发的平台的功能逐渐增加,“修改dcm文件的相关数据元”在所难免。下面将简单的介绍一下对dcm文件的修改,主要的参考资料是:dcmtk开源库的官方文件,另外也很感谢diqiucun666在CSDN的博文http://blog.csdn.net/diqiucun666/article/details/2866908,里面详细介绍了dcmtk的主要构成,是dcmtk开源库很好的中文是说明手册。
参照博文中的:
dcmtk开源库中对dcm文件定义的最顶层的类是:DcmFileFormat,每次需要利用DcmFileFormat的对象来进行dcm文件的导入(loadFile)和导出(saveFile)。dcm文件其本质与常见的DIB文件格式相似,可总体分为“文件头”和“文件体”两部分。dcmtk开源库分别为“文件头”和“文件体“封装了相应的类:DcmMetaInfo和DcmDataset。两个类都继承自DcmItem类,其含有主要的成员变量为:elementList,一个存储相应dcm文件数据元的双向列表。(注意:DcmFileFormat类继承自DcmSequenceOfItems类,其含有的数据成员变量时itemList,即含有DcmMetaInfo类和DcmDataset类的基类的双向列表——这说明了dcm文件的数据元可以进行嵌套存储),DcmFileFormat变量的成员参见下图:
此处是一个空的DcmFileFormat类的对象mDcmFileFormat,其itemList双向链表中只有两个item成员,firstNode就是DcmMetaInfo类的实例,lastNode就是DcmDataset类的实例。
那么找到修改itemList数据成员的方法,就能够修改相应的dcm数据元,达到自由修改dcm文件的目的,但是在修改的时候需要注意,各个数据元的元素类型的匹配。
查看dcitem.h文件,可以发现dcmtk给我们定义了几种操作itemList双向链表的方法,如下图:
下面给出修改dcm文件中的患者姓名和dcm像素数据的代码:
DcmFileFormat mDcmImage;mDcmImage.loadFile("c:\\test.dcm");short* pPixelData=static_cast<short*>(mDcmImage.getPixelData());int size=mDcmImage.getWidth()*mDcmImage.getHeight();for(int i=0;i<size;++i)if(pPixelData[i]<800)pPixelData[i]=0;elsepPixelData[i]=2000;UINT16 *pData=new UINT16[size];memcpy(pData,pPixelData,size*sizeof(UINT16));DcmDataset *dataset=mDcmImage.getDataset();DcmMetaInfo *metainfo=mDcmImage.getMetaInfo();metainfo->remove(DCM_TransferSyntaxUID);delete dataset->remove(DCM_PatientName);dataset->putAndInsertString(DCM_PatientName,"TEST-THU");delete dataset->remove(DCM_PixelData);dataset->putAndInsertUint16Array(DCM_PixelData,pData,size);mDcmImage.saveFile("c:\\self.dcm",EXS_LittleEndianExplicit);
其中getPixelData()函数是对:
DcmDataset *dataset = this->getDataset();// decompress data set if compresseddataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL);DcmElement* element=NULL;dataset->findAndGetElement(DCM_PixelData,element);unsigned char* pImage=NULL;element->getUint8Array(pImage);return pImage;
代码的封装。利用像素指针dcm文件的像素数据进行二值化。
然后我们利用DcmItem类中定义的putAndInsertString()修改DCM_PatinetName标签,即患者的姓名。
对别结果如下:
- DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改
- DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试
- DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)
- DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)
- dcmtk修改
- DCMTK的编译总结
- DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档
- DCMTK中storeSCP例子的多线程实现
- DCMTK
- [搬家]DCMTK的编译总结
- DCMTK的Lib 引用顺序
- dicom文件的显示(基于dcmtk实现)
- dicom文件的显示(基于dcmtk实现)
- dicom文件的显示(基于dcmtk实现)
- 使用DCMTK遍历读取DICOM文件所有Tag的方法
- dicom文件的显示(基于dcmtk实现)
- DCMTK学习之RGB颜色的存储以及转换
- DCMTK学习之读取DcmDataset对应tag的值
- Android NDK开发(1)----- Java与C互相调用实例详解 .
- web project项目到MyEclipese中,在Package Explorer中工程前面有一个红色感叹号
- 大家好哇,好久木有写blog了
- Java配置
- iOS学习--列表下拉/上拉刷新: (一)EGORefreshTableHeaderView使用、定义EGORefreshTableFooterView
- DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改
- SOW
- C++ 实现单链表
- Linux 下的解压缩命令
- ADOQUERY,CLIENTDATASET,ADOSTOREPROC执行存储过程【多种方法】
- 网站的简略设计
- Java多线程技术初识——9,等待唤醒机制(二)
- 使用Ajax提高用户体验
- 黑马程序员_java中的异常1