monai.tansforms.xxx 常用函数&作用

1.monai.transforms.LoadPNG(image_only=Falsedtype=)

作用:加载常用的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

monai.tansforms.xxx 常用函数&作用_第1张图片

image_only = False

大白话理解:   image_only = True只返回图像的2维矩阵, image_only = False, 返回2维矩阵,以及图片的其他信息,包括类型,文件地址,大小,图片格式,长,宽等等。

2.monai.transforms.LoadNifti(as_closest_canonical=Falseimage_only=Falsedtype=)

作用:加载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'])

3 monai..transforms.LoadNiftid(keysas_closest_canonical=Falsedtype=meta_key_postfix='meta_dict'overwriting=False)

作用: 基于字典加载图像,在训练网络时,一般会把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'])

4.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.tansforms.xxx 常用函数&作用_第2张图片

5. monai.transforms.RandGaussianNoise(prob=0.1mean=0.0std=0.1)

作用: 随机高斯噪声, 加d表示对字典操作,如RandGaussianNoised(对字典操作的函数需要由参数keys)

参数prob: 添加噪声的概率。

 

6.  monai.transforms.Flip(spatial_axis)

作用:沿给定空间轴的顺序反转元素,并保持形状。具体怎么转参考np.flip()

参数:spatial_axis: spatial_axis=1, 从我的3D 脑MRI 图像来看,图像被上下颠倒了。

monai.tansforms.xxx 常用函数&作用_第3张图片

 本来是从头顶到脖子,反转后是从脖子到头顶。原始图像为1subject001_T1c.

spatial_axis=0, 图像被前后颠倒。

monai.tansforms.xxx 常用函数&作用_第4张图片

本来图像是从身体前面到后脑勺,反转后是从后脑勺到前面。从横断位上可以发现,原始图像的上部为眼睛,反转后眼睛到最底下去了。

spatial_axis=None, 应该就是都反转

spatial_axis= 其他

7. monai.data.NiftiSaver(output_dir: str = "./", output_postfix: str = "seg", output_ext: str = ".nii.gz")

 

作用对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']来得到保存数据的文件名

最后得到的结果:

monai.tansforms.xxx 常用函数&作用_第5张图片

 

会创建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的矩阵。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Monai)