DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试

本文介绍了使用DCMTK库解压缩JPEG格式的DICOM文件的方法,并提供了代码示例。文章详细展示了如何读取和解压DICOM文件,以及如何获取解压后的像素数据内存指针。

DCMTK官网给出了JPEG格式压缩的DCM文件解压缩的方法(http://support.dcmtk.org/docs/mod_dcmjpeg.html),代码摘录如下:

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)给出了获取解压后的真实像素数据内存指针的方法,主要是的语句是:

<span style="white-space:pre">	</span>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格式,生成的结果依然是原始图像。

转载于:https://my.oschina.net/zssure/blog/354760

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值