1.首先读取h5文件为.nii.gz格式
import h5py
import os
import numpy as np
import SimpleITK as sitk
dataset = h5py.File(r'./datasets/train/youyi_liver.h5', 'r') #指定h5文件的路径
savepath = './datasets/youyi_liver' #另存为nii文件的路径
first_level_keys = [key for key in dataset.keys()]
for first_level_key in first_level_keys:
if not os.path.exists(os.path.join(savepath, first_level_key)):
os.makedirs(os.path.join(savepath, first_level_key))
second_level_keys = [key for key in dataset[first_level_key].keys()]
for second_level_key in second_level_keys:
if not os.path.exists(os.path.join(savepath, first_level_key, second_level_key)):
os.makedirs(os.path.join(savepath, first_level_key, second_level_key))
image_arr = np.array(dataset[first_level_key][second_level_key])
img = sitk.GetImageFromArray(image_arr)
img.SetSpacing([1.0, 1.0, 1.0]) #根据需求修改spacing
sitk.WriteImage(img, os.path.join(savepath, first_level_key, second_level_key, second_level_key + ".nii.gz"))
print(first_level_key)
运行后如下图所示:
2.将.nii格式或.nii.gz格式显示为图片
from nibabel.viewers import OrthoSlicer3D
from nibabel import nifti1
import nibabel as nib
from matplotlib import pylab as plt
import matplotlib
# 文件名,nii或nii.gz
example_filename = r'D:\python\project\RCN\datasets\youyi_liver\00139427_225\volume\volume.nii.gz'
img = nib.load(example_filename)
# 打印文件信息
print(img)
print(img.dataobj.shape)
#shape不一定只有三个参数,打印出来看一下
width, height, queue = img.dataobj.shape
# 显示3D图像
OrthoSlicer3D(img.dataobj).show()
# 计算看需要多少个位置来放切片图
x = int((queue/10) ** 0.5) + 1
num = 1
# 按照10的步长,切片,显示2D图像
for i in range(0, queue, 10):
img_arr = img.dataobj[:, :, i]
plt.subplot(x, x, num)
plt.imshow(img_arr, cmap='gray')
num += 1
plt.show()
显示的结果如下所示: