monai.transforms.
LoadPNG
(image_only=False, dtype=作用:加载常用的2维图像,格式包括 (PNG, JPG, etc. using PIL)
参数:
image_only: 布尔值,true or false; if true: 只返回 image volume, 否则返回 image data array and metadata
实例
import monai.transforms as mt
img = './MedNIST/CXR/000000.jpeg'
a = mt.LoadPNG(image_only= False)(img)
print(a)
image_only = True
image_only = False
大白话理解: image_only = True只返回图像的2维矩阵, image_only = False, 返回2维矩阵,以及图片的其他信息,包括类型,文件地址,大小,图片格式,长,宽等等。
transforms.
LoadNifti(as_closest_canonical=False, image_only=False, dtype=作用:加载Nifti格式的图片,是底层Nibabel图像加载器的一个简单的可调用包装器。在使用一些必要的系统参数构造加载程序之后,使用NIfTI文件名调用加载程序实例将返回图像数据数组以及元数据——例如仿射信息和体素大小。
参数:as_closest_canonical: 如果为True,则加载最接近规范轴格式的图像?
image_only : 如果为True, 则只返回图像矩阵,反之返回图像矩阵和元数据(字典,包括仿射信息等)
loader = LoadNifti(dtype=np.float32)
path = '/Users/luo/workspace/spyder/brain_classification/IXI-T1/IXI405-Guys-0948-T1.nii.gz'
image, metadata = loader(path)
print('image shape', image.shape)
print('image affine', metadata['affine'])
print('image pixdim', metadata['pixdim'])
transforms.
LoadNiftid(keys, as_closest_canonical=False, dtype=作用: 基于字典加载图像,在训练网络时,一般会把image 和对应的label同时存放在一个字典里面,label也是图像才行,而我们要从这个字典里只加载image 或者 label
参数: keys: 就是字典的keys有哪些,
data_dicts = [{'image': image_name, 'label': label_name}
for image_name, label_name in zip(images, labels)]
loader = LoadNiftid(keys=('image', 'label'))
data_dict = loader(train_data_dicts[0])
print('input:', train_data_dicts[0])
print('image shape', data_dict['image'].shape)
# print('label shape', data_dict['label'].shape)
print('image pixdim', data_dict['image_meta_dict']['pixdim'])
monai.transforms.
AddChannel
()作用:使图片的矩阵采用channel优先模式(),对于2D图像,尺寸为(length, width),通过该函数后尺寸为(1,length, width)
实例
img = './MedNIST/CXR/000000.jpeg'
a = mt.LoadPNG(image_only= True)(img)
print(a.shape)
b = mt.AddChannel()(a)
print(b.shape)
monai.transforms.
RandGaussianNoise
(prob=0.1, mean=0.0, std=0.1)作用: 随机高斯噪声, 加d表示对字典操作,如RandGaussianNoised(对字典操作的函数需要由参数keys)
参数:prob: 添加噪声的概率。
monai.transforms.Flip(
spatial_axis)
作用:沿给定空间轴的顺序反转元素,并保持形状。具体怎么转参考np.flip()
参数:spatial_axis: spatial_axis=1, 从我的3D 脑MRI 图像来看,图像被上下颠倒了。
本来是从头顶到脖子,反转后是从脖子到头顶。原始图像为1subject001_T1c.
spatial_axis=0, 图像被前后颠倒。
本来图像是从身体前面到后脑勺,反转后是从后脑勺到前面。从横断位上可以发现,原始图像的上部为眼睛,反转后眼睛到最底下去了。
spatial_axis=None, 应该就是都反转
spatial_axis= 其他
作用: 对transform的图像进行输出查看,保存为nii.gz格式,numpy to NIFTI. 检查transform之后的变化是不是符合预期,可使用该方法。此外,NiftiSaver可用于保存分割后的图像。
官方说明:Save the data as NIfTI file, it can support single data content or a batch of data. Typically, the data can be segmentation predictions, call `save` for single data or call `save_batch` to save a batch of data together. If no meta data provided, use index from 0 as the filename prefix. (保存单一图像使用NiftiSaver.save(), 保存一个批次使用NiftiSaver。save_batch())
NiftiSaver.save(data,meta_data)
Args:
data (Tensor or ndarray): target data content that to be saved as a NIfTI format file.
Assuming the data shape starts with a channel dimension and followed by spatial dimensions.
meta_data (dict): the meta data information corresponding to the data.(如果没有给定,生成的文件会自动命名)
NiftiSaver.save_batch(batch_data, meta_data) # 类似save()
可见,NiftiSaver需要两次调用。具体怎么调用也可以查看源代码。
实例: 加载一个nii.gz格式的文件,并对其进行一些列的transform后,再保存为nii.gz格式的文件。
# 图像地址
img_path = '/Users/luo/workspace/pycharm/brain_binary/1subject001_T1c.nii.gz'
# transforms系列
transform = Compose([Flip(spatial_axis=1), AddChannel()])
# 加载图像,from monai.transforms import LoadNifti
loader = LoadNifti(dtype=np.float32)
# 获取到image array 和 meta data
img, meta = loader(img_path)
# 对图像进行transform
flipdata = transform(img) # np.array
print(flipdata.shape) # (1,182,218,182)
# 创建saver
saver = NiftiSaver(output_dir='flip', output_postfix='flip0', output_ext='.nii.gz')
# 调用save函数, 保存单一图像, 如果是批数据,使用saver.save_batch()
saver.save(flipdata, meta) # meta为字典,里面存有图像信息,该函数获取meta['filename_or_obj']来得到保存数据的文件名
最后得到的结果:
会创建2级文件,并自动获取文件的的名字。
注意,在Compose的时候,需要组合至少两种变化,不然会报错。
上述变换因为用了Addchannel(), 所以会比原始图像多一个通道。不需要则可以改成
transform = Flip(spatial_axis=1)
但是不用Addchannel(), 使用saver.save()函数就会有问题,会发现保存下来的图片不是三维的。
解决办法,使用nibabel保存
img_path = '/Users/luo/workspace/pycharm/brain_binary/1subject001_T1c.nii.gz'
# transforms系列
# transform = Compose([RandFlip(spatial_axis=1), AddChannel()])
# 旋转
transform = RandRotate(range_x=45, range_y=45, range_z=45, prob=1)
loader = LoadNifti(dtype=np.float32)
# 获取到image array 和 meta data
img, meta = loader(img_path)
print(meta['filename_or_obj'])
# 对图像进行transform
flipdata = transform(img) # np.array
print(flipdata.shape) # (182,218,182)
# meta为字典,里面存有图像信息,该函数获取meta['filename_or_obj']来得到保存数据的文件名
new_image = nib.Nifti1Image(flipdata, meta['affine'])
new_image.set_data_dtype(np.float)
nib.save(new_image, 'my_arr.nii.gz')
nib.Nifti1Image必须要给affine值,是一个4*4的矩阵。