nii.gz文件处理起来总是那么麻烦,学到了一个新的工具,用来裁剪nii.gz文件。
数据处理系列篇:
【数据处理】Python读取.mat文件的方法
【数据处理】Python读取.dcm文件的方法
【数据处理】Python解析json文件
【数据处理】Python解析多类别分割标签的json文件
【数据处理】nii文件解析
【数据处理】Python解析nii.gz文件
0、所需安装
pip install pymic
1、场景描述
我有一个图像文件为nii.gz格式,做了一个分割,得到了一个mask,格式也为nii.gz,我需要根据mask,设定一个box框,裁剪对应的图像文件。对应到一个临床问题上就是,心脏核磁数据,我需要裁剪关于心脏的感兴趣区域,其他部分舍弃掉。
原始图像数据:
分割得到的mask数据:
目标:根据mask框定心脏区域
2、代码实现
import numpy as np
import SimpleITK as sitk
from pymic.util.image_process import crop_ND_volume_with_bounding_box, get_ND_bounding_box
from pymic.io.image_read_write import save_array_as_nifty_volume
mask_path = './Cine_pred_mask/myops_test_201_C0.nii.gz'
mask_crop_path = './mask_crop_test.nii.gz'
image_path = './Cine/myops_test_201_C0.nii.gz'
image_crop_path= './image_crop_test.nii.gz'
margin = [0, 30, 30] # 预留边缘
mask_sitk = sitk.ReadImage(mask_path) # 数据读取
mask_npy = sitk.GetArrayFromImage(mask_sitk) # 获得numpy数组
mask_shape = mask_npy.shape
crop_bbox_min, crop_bbox_max = get_ND_bounding_box(mask_npy, margin=margin) # 获得外矩形框
crop_bbox_min[0] = 0
crop_bbox_max[0] = mask_shape[0]
print(crop_bbox_min, crop_bbox_max)
# 裁剪mask后的数组
mask_output_npy = crop_ND_volume_with_bounding_box(mask_npy, crop_bbox_min, crop_bbox_max)
# 保存裁剪后的数组为nii.gz
# mask_output_npy: 输出裁剪后的数组
# mask_crop_path: 输出的路径
# mask_path: 参考数据的路径, 原始的mask路径
save_array_as_nifty_volume(mask_output_npy, mask_crop_path, mask_path)
# image的裁剪与保存(与mask同)
image_sitk = sitk.ReadImage(image_path)
image_npy = sitk.GetArrayFromImage(image_sitk)
image_output_npy = crop_ND_volume_with_bounding_box(image_npy, crop_bbox_min, crop_bbox_max)
save_array_as_nifty_volume(image_output_npy, image_crop_path, image_path)
# 也可以只保存一张
save_array_as_nifty_volume(image_output_npy[3][np.newaxis, :, :], './one_image_crop_test.nii.gz', image_path)
裁剪后的mask显示:
裁剪后的image显示:
裁剪完成后就可以接着做后续处理啦。
其实自己写代码,直接去处理nii.gz读取获得的numpy数组也可以完成目标,但是麻烦一点~