数据集的来源:2013 MICCAI Challenge Workshop on Segmentation: Algorithms, Theory and Applications (“SATA”)
举例所用数据集:百度网盘 验证码:ctcv
参考链接:1、如何处理.nii文件
具体代码如下:
# #导入相关的库
import numpy as np
import os
import nibabel as nib
import cv2
import pickle
# #一些参数的设置
# .nii.gz 文件路径
nii_training_data_path = "D:/WindowsData/Desktop/test_dataset/dataset/"
# 生成的 pickle 文件存放路径
pickle_data_saving_path = "D:/WindowsData/Desktop/test_dataset/dataset_pickle/"
# 保留非 0 数据比重超过 preserving_ratio 的切片
preserving_ratio = 0.25
filenames = os.listdir(nii_training_data_path)
nii_train_list = []
for filename in filenames: # 获取所有.nii.gz的文件名
if filename.endswith('nii.gz'):
nii_train_list.append(filename)
print('.nii.gz文件数为:', len(nii_train_list))
nii_train_dataset = []
for i, f in enumerate(nii_train_list):
data_path = os.path.join(nii_training_data_path, f)
data = nib.load(data_path).get_data() # 获取.nii.gz文件中的数据
# print('.nii.gz文件的维度为:',data.shape) #宽*高*切片数
data = data / np.amax(data) # 所有数据归一化
for i in range(data.shape[2]): # 对切片进行循环,选出满足要求的切片
img = data[:, :, i] # 每一个切片是一个灰色图像
if float(np.count_nonzero(img) / img.size) >= preserving_ratio:
img = np.transpose(img, (1, 0)) # 将图片顺时针旋转90度(摆正了)
nii_train_dataset.append(img)
print('选出符合preserving_ratio的图片有:', len(nii_train_dataset))
pickle_train_dataset = np.asarray(nii_train_dataset) # list类型转为数组 切片数*宽*高
# 将数据保存为pickle类型,方便读取
if not os.path.exists(pickle_data_saving_path):
os.makedirs(pickle_data_saving_path)
with open(os.path.join(pickle_data_saving_path, 'training.pickle'), 'wb') as f:
pickle.dump(pickle_train_dataset, f, protocol=4)
print('.nii.gz 转换 .pickle 完成!!!')
#######################################################
#需要用pickle数据的话,可以用下面方法读取,eg如下
f = open(os.path.join(pickle_data_saving_path,'training.pickle'),'rb')
train = pickle.load(f) #train 与原来的 pickle_train_dataset 一模一样
for i in range(train.shape[0]):
cv2.imshow('img',train[i,:,:])
cv2.waitKey(100)
cv2.destroyAllWindows()
运行结果: