X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
医疗电子
[原创] 《深度学习与医学图像处理》【学习分享4】DICOM和Nifti医学影像格式读取和可视化
HonestQiao
2024-5-3 23:13
楼主
## 一、常用医学影像格式 医学检查后获取的数据需要进行保存,以便后续进行查阅和使用。检查的数据,通常是无法直接保存为图片数据的因为那样会丢失很多关键信息,因此需要保存为专用的医学影像格式。 在实际使用中,最为常用的医学影像格式为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[0]) 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() ``` 实际输入如下:
通过了解主要使用的医学图像影像格式,后面就能够对数据集进行实际的操作使用了,如关键信息和数据的提取,以及对数据进行二次加工。
点赞
回复评论 (2)
沙发
Jacktang
CT成像就是这样的原理么
点赞
2024-5-5 07:35
板凳
HonestQiao
引用:
Jacktang 发表于 2024-5-5 07:35
CT成像就是这样的原理么
这个不是原理。
是CT扫描后的数据,会采用这些方式保存。
点赞
2024-5-5 12:33
最新活动
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
随便看看
工业串口蓝牙运用技巧
技术文章:适用于IEPE传感器的24位数据采集系统
UCOS的中断嵌套
给初学者布置一个小作业
关于驱动同内核同用户的关系
欲选择xilinx 芯片型号求高人指点
我的称重用什么传感器好?
你好!
芯灵思SinA33开发板虚拟机编译源码
求conexant hsf cx11252-41 芯片的硬件说明文档/开发文档/databooks
怎样用8051直接控制直流电机的反正转
硬件验证语言——简介
【招聘】射频工程师
教你认识元件封装图
11月23日是 斐波那契日
51单片机开发小工具
电源中“地”的问题
想知道一下心电采集这个模块是什么意思
在stm32中用volatile修饰的变量是什么意思
NIOS II 添加PIO但是没有引脚输出【已解决】
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复