DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试
2013-04-10 21:17
369 查看
DCMTK官网给出了JPEG格式压缩的DCM文件解压缩的方法(http://support.dcmtk.org/docs/mod_dcmjpeg.html),代码摘录如下:
通过尝试,生成的test_decompressed.dcm的传输语义TransferSyntex发生了改变,且像素数据区中的数据就代表了dcm图像中的真实像素值。利用UltraEdit等二进制编辑软件打开后一目了然:
原本压缩的像素数据区,被解压了出来:30 F8 30 F8 30 F8……,dcm文件中每个像素用16位来表示,采用的小端存储模式,30 F8就是十进制的-2000,即测试图像的填充背景的CT值。
博文(http://support.dcmtk.org/wiki/dcmtk/howto/accessing-compressed-data)给出了获取解压后的真实像素数据内存指针的方法,主要是的语句是:
此处有一个问题未能解决:如果在对pixData指向的区域进行操作后,调用保存函数saveFile时未选择EXS_LittleEndianExplicit格式,生成的结果依然是原始图像。
DJDecoderRegistration::registerCodecs(); // register JPEG codecs DcmFileFormat fileformat; if (fileformat.loadFile("test_jpeg.dcm").good()) { DcmDataset *dataset = fileformat.getDataset(); // decompress data set if compressed dataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL); // check if everything went well if (dataset->canWriteXfer(EXS_LittleEndianExplicit)) { fileformat.saveFile("test_decompressed.dcm", EXS_LittleEndianExplicit); } } DJDecoderRegistration::cleanup(); // deregister JPEG codecs
通过尝试,生成的test_decompressed.dcm的传输语义TransferSyntex发生了改变,且像素数据区中的数据就代表了dcm图像中的真实像素值。利用UltraEdit等二进制编辑软件打开后一目了然:
原本压缩的像素数据区,被解压了出来:30 F8 30 F8 30 F8……,dcm文件中每个像素用16位来表示,采用的小端存储模式,30 F8就是十进制的-2000,即测试图像的填充背景的CT值。
博文(http://support.dcmtk.org/wiki/dcmtk/howto/accessing-compressed-data)给出了获取解压后的真实像素数据内存指针的方法,主要是的语句是:
DcmElement* element = NULL; result = data->findAndGetElement(DCM_PixelData, element); if (result.bad() || element == NULL) return 1; short* pixData; result = element->getUint8Array(pixData);此时pixData就指向了上图中的30 F8 30 F8 30 F8像素数据区的首地址。至此可以直接对dcm的像素进行操作,如下图是对其进行二值化的结果:
此处有一个问题未能解决:如果在对pixData指向的区域进行操作后,调用保存函数saveFile时未选择EXS_LittleEndianExplicit格式,生成的结果依然是原始图像。
相关文章推荐
- DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试
- DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)
- DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档
- DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)
- DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改
- DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改
- (C#)学习笔记1:文件和注册表操作
- SVNKit学习——使用低级别的API(ISVNEditor接口)直接操作Repository的目录和文件(五)
- Python学习笔记——文件对象和操作(2)
- iOS学习笔记(十七)——文件操作(NSFileManager)
- Java学习笔记——File类之文件管理和读写操作、下载图片
- Linux命令学习笔记之一目录与文件基本操作
- Python学习笔记——文件操作、综合应用
- c#学习笔记之文件操作
- IOS学习笔记22—文件操作(NSFileManager)结合相册小例子
- Java学习笔记——File类文件管理及IO读写、复制操作
- Linux学习笔记2-文件读写操作
- 文件操作学习笔记(一):基本概念与简单函数
- [学习笔记]Java文件IO操作------实现对文件的读取与写入
- C++学习笔记之对文件的操作<2>