7 DICOM成像协议编码实现-有损压缩和无损压缩解压

本文详细介绍了DICOM成像协议中的有损和无损压缩格式,如JPEG-LS和JPEG 2000,并展示了如何解压缩这些格式的图像数据。文中提供了一个完整的 DICOM 解析引擎,能够读取 DICOM 文件,对 PixelData 进行解压缩,并转换为 BMP 图像。此外,还讨论了不同设备(CT, MR, US)采用的压缩算法选择及其压缩效率。" 100136780,4874695,VOC 2012数据增强实证分析,"['图像处理', '数据集', '深度学习', '计算机视觉', '数据预处理']
摘要由CSDN通过智能技术生成

以下链接是本系列文章,不足之处,可在评论区讨论:
系列文章

以下链接中的代码是完整的且可运行的,链接如下,可按需下载:
dicom成像程序

  本篇文章对应 专栏 从零讲解DICOM协议-成像协议中的文章DICOM成像协议剖析DICOM成像协议实现思路,建议先看以上两篇文章以了解DICOM底层协议,有助于理解代码实现。

上篇文章DICOM成像协议编码实现-读取元素讲解了DICOM解析引擎的实现思路和整体代码框架,并完成

  1. 读取DICOM文件至内存中
  2. 读取文件头到文件头对象中
  3. 按照元数据组特性读取元数据组中的各个DataElement
  4. 按照数据组特性读取数据组中的各个DataElement

本篇文章将继续进行以下几部分的代码思路讲解和实现:

  1. 如果PixelData是压缩格式,则用相应的解压算法解压
  2. CT值转BMP,保存BMP图像

  相应的开源算法
在这里插入图片描述

  DICOM协议中规定了众多的压缩格式,包括无损压缩和有损压缩。
常见的压缩有:
有损压缩:
JPEG-LS Lossy (Near-Lossless) Image Compression
  1.2.840.10008.1.2.4.81
JPEG Extended (Process 2 & 4)
  1.2.840.10008.1.2.4.51

无损压缩:
JPEG 2000 Image Compression (Lossless Only)
  1.2.840.10008.1.2.4.90]
JPEG-LS Lossless Image Compression
  1.2.840.10008.1.2.4.80
JPEG Lossless, Non-Hierarchical, First-Order Prediction(Process 14[Selection Value 1])
  1.2.840.10008.1.2.4.70

  针对不同设备(CT,MR,US)的DICOM图像特点,采用不同的压缩算法,无损压缩的压缩效率低,压缩率不可调节,一般在3倍压缩率。有损压缩效率高,可调节压缩率,一般采用10倍压缩,既能保证图像清晰度,又有较高的压缩率。

  一张CT图像一般行列像素数为515*512个,每个像素占用2个字节存储,则原始CT图像大小为512 *512 *2 / 1024 = 512KB,按一个检查600张图像计算,则有300MB,存储空间占用较大。因此一般采用压缩存储。

  原始图像如果是单帧,则PixelData是普通DataElement格式,Length的值是Value的长度,5125122=524288
在这里插入图片描述在这里插入图片描述
压缩图像PixelData是SQ序列格式DataElement,其格式为:
总长度是0xFFFFFFFF(无意义),每个item长度固定
压缩格式只有,(FFFE,E000),(FFFE,E0DD)
(FFFE,E000) Item
(FFFE,E000) Item
(FFFE,E0DD) Delimitation Item
多帧图像,每帧为一个Item
在这里插入图片描述
在这里插入图片描述
为统一处理原始图像和压缩图像,代码如下:

ElementData DcmRead::GetPixelData()duozh
{
   
	vector<ElementData> pixelset = GetElement(TagName::PixelData).valueset;
	//非压缩
	if (ef != ElementFormat::CompressPixel)
	{
   
		return pixelset[0];
	}
	
	//压缩
	return UnCompressPixel(pixelset);
}

解压缩代码:
以jpeg2000压缩为例:
  多帧图像,每帧单独压缩,按帧解压缩
  计算压缩图像对应的原始像素占用的空间
  unsigned long destlen = ((bitsallocated > 8) ? sizeof(unsigned short) : sizeof(unsigned char)) * height * width * sampelsperpixel;

压缩数据解压后,解压数据填充到dest

ElementData 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DICOM医学影像

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值