以下链接是本系列文章,不足之处,可在评论区讨论:
系列文章
以下链接中的代码是完整的且可运行的,链接如下,可按需下载:
dicom成像程序
本篇文章对应 专栏 从零讲解DICOM协议-成像协议中的文章DICOM成像协议剖析和DICOM成像协议实现思路,建议先看以上两篇文章以了解DICOM底层协议,有助于理解代码实现。
上篇文章DICOM成像协议编码实现-读取元素讲解了DICOM解析引擎的实现思路和整体代码框架,并完成
本篇文章将继续进行以下几部分的代码思路讲解和实现:
相应的开源算法
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