基于Kaggle学习MONAI(二)轻松上手 transforms(上)

1 简介

transforms是MONAI提供的数据预处理API,可以用来进行数据加载、保存,还可以进行图像旋转、尺度缩放、裁剪等常规图像处理功能。下面详细介绍在Kaggle平台如何实现MONAI transforms的常用操作。

2 具体实现

2.1 kaggle环境配置

(1)为Kaggle加载演示数据:
在Kaggle界面右侧的Input区域,点击upload按钮,如下图所示。
上传数据按钮
加载脾脏CT数据和掩模数据后,Input区域显示结果如下图所示:
数据加载示意图
spleen_10trans.nii是脾脏CT成像文件,大小为512×512,而spleen_10mask.nii是对应的掩模图像,大小也是512×512。注意,我们上传的是spleen_10mask.nii.gz和spleen_10trans.nii.gz文件,Kaggle在数据加载的时候可以自动提取压缩文件,验证数据已上传。
(2)配置环境
Kaggle平台集成了大多数机器学习软件包,但是并没有MONAI软件,需要我们手动安装并导入。代码及注释如下:

# 安装monai
!pip install monai

成功安装后,结果显示如图所示:
在这里插入图片描述
我们成功安装monai 1.3.1版本

2.2 具体实现

2.2.1 加载图像数据

transforms支持两种加载图像数据的方式,一种是仅加载图像数据信息,用LoadImage函数;另一种是同时加载图像数据和掩模图像数据,即字典加载方式,使用LoadImaged函数。在神经网络训练过程中,我们多采用字典加载方法,因此本文也采用基于字典的函数来演示操作过程。
先通过import导入LoadImaged函数,再通过数据文件路径和掩模文件路径以字典方式读入数据到datadict。代码及详解如下:

# 数据载入,定义字典,
from monai.transforms import LoadImaged #导入LoadImaged
# 设置图像数据目录和掩模图像数据目录字典,后面根据字典键值索引对应数据
inputs = {"image": "/kaggle/input/monaitransfomdata/spleen_10trans.nii",
         "label": "/kaggle/input/monaitransfomdata/spleen_10mask.nii"}
# 按照keys对应的键值加载数据和掩模
data_dict = LoadImaged(keys=['image','label'])(inputs)
# 打印出图像和掩模的尺寸
data_dict['image'].shape,data_dict['label'].shape

代码块正确运行后,显示结果如下所示:
在这里插入图片描述
可以看出,图像数据和掩模数据尺寸都是512×512。除了nii类型文件外,LoadImaged还支持dicom和png文件。

2.2.2 可视化数据

通过matplotlib.pyplot模块,可以非常方便地对上一步导入的数据进行可视化,在实际应用中,也要可视化数据以确认数据加载操作是否正确实现。代码及注释如下:

# 显示 plt。fis
plt.figure("image",(8,4))#创建4×8英寸窗口
plt.subplot(1,2,1)#创建1×2布局窗口的第一个窗口
plt.imshow(data_dict['image'],cmap='gray')#绘制脾脏CT图像,灰度图像模式显示
plt.xlabel(f'{data_dict["image"].shape}')#添加x轴标签

plt.subplot(1,2,2)#创建1×2布局窗口的第二个窗口
plt.imshow(data_dict['label'],cmap='gray')#绘制脾脏掩模图像,灰度图像模式显示
plt.xlabel(f'{data_dict["label"].shape}')#添加x轴坐标
plt.show()

代码正确运行后,显示结果如下图所示:
在这里插入图片描述

2.2.3 通道前移

MONAI框架对数据的形状的要求是通道排在最前面,例如数据图像的形状为(512,512),MONAI是无法直接处理。需要在前面增加1个维度,形状变为(1,512,512)后才能进行其他操作。transforms提供了EnsureChannelFirstd函数,能够在数据前面增加一个维度作为通道。代码及注释如下:

#从transforms导入EnsureChannelFirstd函数
from monai.transforms import EnsureChannelFirstd
#实例化EnsureChannelFirstd函数对数据字典进行通道前移操作
tc = EnsureChannelFirstd(keys=['image','label'])(data_dict)
#确认操作后的数据形状和掩模形状
tc['image'].shape,tc['label'].shape

代码成功运行结果如下:
在这里插入图片描述
可以看出,通过EnsureChannelFirstd函数后,数据形状前面增加了1个通道。注意,现在取用图像数据的变量应该写为tc[‘image’][0]。现在大家可以试一试,利用前面的可视化代码把t字典变量tc对应的图像和掩模绘制出来。

2.2.4 尺寸缩放

MONAI框架需要图像数据大小相同,transforms提供了Resize函数,能够实现对图像和掩模同时进行放大和缩小操作,以便后续的数据处理操作。注意:MONAI框架下的尺寸缩放操作需要图像数据满足通道优先的格式。代码及注释如下:

# 必须通道优先后才能执行缩放
# 从transforms导入Resized模块
from monai.transforms import Resized
# 实例化Resized函数,对上一步的字典变量进行操作
tr = Resized(keys=['image','label'],spatial_size=(256,256))(tc)
# 检查一下尺寸缩放后图像和掩模的形状
tr['image'].shape,tr['label'].shape

上述代码通过spatial_size = (256,256)参数,把原来(512,512)的图像缩小为原来的一半,修改spatial_size值,变换后图像可以缩小或放大到指定的尺寸。
代码成功运行后结果如图所示:
在这里插入图片描述
接下来,我们可以用上面的可视化代码来显示缩放后的图像和掩模。代码及注解如下:

#可视化 fis
plt.figure("image",(8,4))# 创建4×8英寸窗口
plt.subplot(1,2,1)#创建1×2布局的第一个窗口
plt.imshow(tr['image'][0],cmap='gray')#通过tr['image'][0]引用图像,并显示
plt.xlabel(f'{tr["image"].shape}')#把图像的形状添加在x轴标签

plt.subplot(1,2,2)#创建1×2布局的第二个窗口
plt.imshow(tr['label'][0],cmap='gray')#通过tr['image'][1]引用掩模,并显示
plt.xlabel(f'{tr["label"].shape}')#把掩模的形状添加在x轴标签
plt.show()

代码成功运行的结果如下图所示:
在这里插入图片描述

3 总结

今天介绍了MONAI框架transforms所涉及的一些基本操作,包括数据装载LoadImaged、通道优先EnsureChannelFirstd和尺寸缩放Resized,并通过可视化看到了变换后的结果。后续将介绍transforms的后续操作,比如旋转、强度变换等等,这些操作是MONAI框架数据集构造和数据集装载器设计的基础。

  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值