HonestQiao 发表于 2024-5-3 23:13

《深度学习与医学图像处理》【学习分享4】DICOM和Nifti医学影像格式读取和可视化

<div class='showpostmsg'>## 一、常用医学影像格式

医学检查后获取的数据需要进行保存,以便后续进行查阅和使用。检查的数据,通常是无法直接保存为图片数据的因为那样会丢失很多关键信息,因此需要保存为专用的医学影像格式。

在实际使用中,最为常用的医学影像格式为DICOM和Nifti。DICOM和NIfTI是两种在医疗影像领域广泛使用的图像数据格式,它们各自具有不同的特点和应用场景。

这两种格式的对比如下:

### DICOM格式
1 综合性:DICOM是一种国际标准,用于医疗影像的获取、存储、打印和传输。它不仅包含图像数据,还包含丰富的患者信息、检查信息和设备参数。
2 兼容性:DICOM格式的文件被广泛接受,几乎所有的医学影像设备和图像处理软件都支持DICOM格式。
3 结构性:DICOM文件由一系列二维图像组成,每个文件代表一个单独的切片,可以包含多个切片,形成一系列图像。
4 信息存储:DICOM文件中存储了大量的元数据,包括患者信息、检查参数、图像的像素数据等。

## NIfTI格式
1. 专用性:NIfTI格式最初是为神经影像学设计的,它特别适合存储三维或四维的大脑成像数据。
2. 简洁性:NIfTI格式通常使用单一文件存储图像数据和相关的元数据,这使得文件管理更为简便。
3. 扩展性:NIfTI格式支持扩展名为.nii的单一文件或.img/.hdr的两个文件,后者保持了与ANALYZE格式的兼容性。
4. 分析友好:NIfTI格式在神经科学研究中非常流行,因为它方便了图像的分析和处理,尤其是在进行三维或更高维度的图像分析时。

### 对比
1. 存储方式:DICOM通常以多个二维切片存储,而NIfTI通常以单一的三维或四维数据集存储。
2. 信息丰富度:DICOM包含更丰富的患者信息和设备参数,而NIfTI则专注于图像数据本身,并附带必要的空间定位信息。
3. 使用场景:DICOM适用于临床医疗影像的存储和传输,而NIfTI更适合于科研领域,特别是在神经影像学分析中。
4. 软件支持:虽然两种格式都被广泛支持,但DICOM在医疗影像设备和医院信息系统中更为普遍,NIfTI则在科研软件和图像分析工具中更受青睐。


在Python中,通过合适的库,可以很好的提供对DICOM和Nifti影像格式数据的支持。

## 二、DICOM影像格式
在python中,安装pydicom,即可对该格式提供支持。
```
pip install pydicom
```
另外,还需要安装其他的库,以便提供后续学习的支持:
```
pip install numpy
pip install pillow
pip install pytest
```

安装该支持库后,默认会提供多种测试数据:


使用下面的代码即可调用:
```
import pydicom
from pydicom.data import get_testdata_files

# 获取Pydicom内置DICOM文件
filename = get_testdata_files('MR_small.dcm')

#读取DICOM文件
ds = pydicom.dcmread(filename)
print(ds)
```

为了实际学习,我下载了 Covid_Scans 的数据集,并拷贝其中的两个文件,用于测试:


参考上述代码,编写读取的程序:
```
import pydicom
from pydicom.data import get_testdata_files

# 读取下载的测试数据文件
ds = pydicom.dcmread('data/56364397.dcm')
# ds = pydicom.dcmread('data/56364823.dcm')
print(ds)
```
运行后,输出如下:


通过书本上的主要参数说明,可以了解数据字段的具体含义:


不过,光看这些数据,还是不太直观,如果能还原为图片进行呈现,就更合适了。
经过了解,使用如下的代码即可:
```
import numpy as np
from PIL import Image

new_image = ds.pixel_array.astype(float)
scaled_image = (np.maximum(new_image, 0) / new_image.max()) * 255.0

scaled_image = np.uint8(scaled_image)
final_image = Image.fromarray(scaled_image)

final_image.show()
```
上述代码中,将数据转换为np格式,然后用Pillow读取数据转换为最终的图像,进行呈现。

具体效果如下:

可以看到,这个文件是图像数据检测时候的相关信息。

再用另外一个数据,得到的图像如下:


这个就是实际的肺部检测数据对应的图像了。

## 三、Nifti影像格式
同样的,先安装几个库提供支持:
```
pip install nibabel
pip install opencv-python
pip install imageio
pip install matplotlib
```

nibabel是提供Nifti对应的.nii文件支持的库,也提供了测试数据集:


调用测试数据的代码如下:
```
import os
import nibabel as nib
from nibabel.testing import data_path

file_path = os.path.join(data_path, 'example4d.nii.gz')
img = nib.load(file_path)
```
nibabel.testing.data_path表示上述安装后对应的测试数据集目录。

为了实际学习,我下载了一个测试数据集,使用如下:


然后使用下面的代码读取:
```
import os
import nibabel as nib
from nibabel.testing import data_path

file_path = 'data/nifti/OBJECT_phantom_T2W_TSE_Tra_17_1.nii'
img = nib.load(file_path)
```

数据对应的具体信息,可以使用如下的方式读取:
```
#放射矩阵
affine = img.affine
print(affine)

# 元数据
header = img.header
print(header)

# 访问header元数据
print(header['sizeof_hdr'])

# 修改
# header['sizeof_hdr'] = 200

# 读取影像数据
data = img.get_fdata()
print(data.dtype, data.shape)
```
输出如下:


同样的,我也进行了学习,将其转换为对应的图片进行呈现,具体代码如下:
```
import cv2
import numpy as np

img_fdata=(data-data.min())/(data.max()-data.min())*255

#开始转换图像
(x,y,z) = img.shape
for i in range(z):   #是z的图象序列
slice = img_fdata[:, :, i]#选择哪个方向的切片自己决定
# print(os.path.join(img_f_path, '{}.png'.format(i)))
# cv2.imwrite(os.path.join(img_f_path, '{}.png'.format(i)), slice)
cv2.imshow("Image", slice)
cv2.waitKey (0)
cv2.destroyAllWindows()
```
实际输入如下:



通过了解主要使用的医学图像影像格式,后面就能够对数据集进行实际的操作使用了,如关键信息和数据的提取,以及对数据进行二次加工。</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                               
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2024-5-5 07:35

<p>CT成像就是这样的原理么</p>

HonestQiao 发表于 2024-5-5 12:33

Jacktang 发表于 2024-5-5 07:35
CT成像就是这样的原理么

<p>这个不是原理。</p>

<p>&nbsp;</p>

<p>是CT扫描后的数据,会采用这些方式保存。</p>
页: [1]
查看完整版本: 《深度学习与医学图像处理》【学习分享4】DICOM和Nifti医学影像格式读取和可视化