文档章节

DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改

zssure_thu
 zssure_thu
发布于 2014/12/11 08:39
字数 741
阅读 394
收藏 0

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;
		else
			pPixelData[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 compressed
		dataset->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标签,即患者的姓名。

对别结果如下:


© 著作权归作者所有

共有 人打赏支持
zssure_thu
粉丝 8
博文 39
码字总数 103107
作品 0
海淀
程序员
私信 提问
DICOM:DICOM标准学习路线图(初稿)

题记: DICOM医学图像处理专栏撰写已有两个年头,积累了近百篇文章。起初只是用于记录自己科研、工作中遇到的疑难问题,专注于图像处理(主要是医学图像,这也正是专栏名称最初的由来);后来...

zssureqh
2015/10/18
0
0
vc++ 6.0 or vc++ 2005 & dcmtk

下载dcmtk 源码 dcmtk-3.5.4.tar.gz 2. 预编译的支持包 dcmtk-3.5.4-win32-i386-md-support.zip , 注意该包使用的是 "Multithreaded DLL" 选项 (/MD and /MDd) 3. 创建目录 如E:dcmtk for v......

povoss
2012/02/21
0
0
DICOM工具包--DCMTK

由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常需要自己编写和DICOM格式的图像相关的各种程序模块,以完成自己处理功能。如果从头开...

匿名
2010/09/21
4.7K
0
DICOM医学图形处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求(续)

背景: 上一篇博文中,在对storescp工具源文件storescp.cc和DcmSCP类的源文件scp.cc进行剖析后,得出了两者都可以实现响应C-ECHO和C-STORE(需要对DcmSCP类进行扩展)请求的功能。但是在对D...

zssure_thu
2014/12/11
0
0
DICOM学习参考

http://dicom.offis.de/dcmtk.php.en http://blog.csdn.net/ningyaliuhebei/article/details/23919401 DICOM:DICOM标准学习路线图(初稿) http://blog.csdn.net/zssureqh/article/details/......

qt_plus
2016/11/08
12
0

没有更多内容

加载失败,请刷新页面

加载更多

声学所实验室的论文

https://hccl.ioa.ac.cn/output/papers/

shengjuntu
29分钟前
0
0
Mysql(Mariadb)数据库主从复制

Mysql主从复制的实现原理图大致如下: MySQL之间数据复制的基础是以二进制日志文件(binary log file)来实现的,一台MySQL数据库一旦启用二进制日志后,其作为master,它数据库中所有操作都...

linux-tao
今天
2
0
Mysql(Mariadb)数据库主从复制

Mysql主从复制的实现原理图大致如下: MySQL之间数据复制的基础是以二进制日志文件(binary log file)来实现的,一台MySQL数据库一旦启用二进制日志后,其作为master,它数据库中所有操作都...

Linux就该这么学
今天
2
0
Mysql(Mariadb)数据库主从复制

Mysql主从复制的实现原理图大致如下: MySQL之间数据复制的基础是以二进制日志文件(binary log file)来实现的,一台MySQL数据库一旦启用二进制日志后,其作为master,它数据库中所有操作都...

xiangyunyan
今天
2
0
Android 贝塞尔曲线实践——旋转的七色花朵

一、关于贝塞尔曲线 在工业设计方面贝塞尔曲线有很多用途,同样,在Android中,贝塞尔曲线结合Path类可以实现更复杂的图形,这里我们给一个案例,来实现一种旋转的花朵。对于贝赛尔曲线的理解...

IamOkay
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部