可以自己精简,我的label是二分类
import SimpleITK as sitk
import cv2
from PIL import Image
import numpy as np
import nibabel as nib # nii格式一般都会用到这个包
import imageio # 转换成图像
import os
import numpy as np
from scipy.ndimage import rotate
from scipy.ndimage import median_filter
import matplotlib.pyplot as plt
xy = 128
vol1 = int(xy/2)
vol2 = int(xy/4)
vol3 = int(vol2+16)
def preprocess(image):
result = median_filter(image, size=3)
"""# 添加高斯噪声
noise = np.random.normal(0, 25, size=image.shape)
noise_img = image + noise.astype('uint8')
# 双边滤波
result = cv2.bilateralFilter(noise_img, 9, 75, 75)
# 显示图像
cv2.imshow('src', image)
cv2.imshow('noise', noise_img)
cv2.imshow('result', result)
cv2.waitKey()
cv2.destroyAllWindows()"""
return result
def create_dirs(out_path, num):
for i in range(1, num): # 这里需要注意,i取不到6,因为range()是前闭后开的,即i的取值范围为1-5。
dir = os.path.join(r'crop/test4/ct/')
# 前者为路径,后者为待创建文件夹的名称。注意,批量创建文件夹时不能有重复名称的,因此可以对文件夹加上序号信息。
isExists = os.path.exists(dir)
if not isExists:
os.mkdir(dir)
def mask2d(input_path, output_folder, idx):
# 加载NIfTI文件
img = nib.load(input_path)
data = img.get_fdata()
# 获取数据的形状信息
num_slices = data.shape[2] # 切片数量
print(data.shape, num_slices)
# 遍历每个切片并保存为PNG图像
for i in range(num_slices):
slice_data = data[:, :, i] # 提取当前切片数据
# Image.fromarray(255*img_array_list[foo].astype('int')).convert('L')
image = Image.fromarray(255 * slice_data.astype('int')).convert('L')
image = image.rotate(270)
# image = Image.fromarray(slice_data) # 创建PIL图像对象
output_name = f"{output_folder}slice_{idx}_{i}.png" # 设置输出文件名
image.save(output_name) # 保存为PNG图像
def nii2d(img_addr, target_folder, idx):
img_addr_n = nib.load(img_addr)
# Convert them to numpy format,
data = img_addr_n.get_fdata()
# clip the images within [-125, 275],
data_clipped = np.clip(data, -125, 275)
# normalize each 3D image to [0, 1], and
data_normalised = (data_clipped - (-125)) / (275 - (-125))
split_root = img_addr.split('\\') # 通过\\来进行截断
print(split_root) # ['crop/test4/ct/volume-0.nii']
# extract 2D slices from 3D volume for training cases while
# e.g. slice 000
for i in range(data.shape[2]):
formattedi = "{:03d}".format(i)
slice000 = data_normalised[:, :, i] * 255
image = Image.fromarray(slice000)
image = image.convert("L")
image = image.rotate(270)
image = image.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
image.save(target_folder +str(idx)+"-"+str(i)+ ".png")
for i in range(20):
k = i + 1
image_path = "ct/volume-{}.nii".format(str(i))
label_path = "label/segmentation-{}.nii.gz".format(str(i))
label = sitk.ReadImage(label_path, sitk.sitkInt16)
label_array = sitk.GetArrayFromImage(label)
image = sitk.ReadImage(image_path, sitk.sitkInt32)
image_array = sitk.GetArrayFromImage(image) # 分别读图像和标签数据
print("\nimage_array=",image_array.shape, " label_array=",label_array.shape)
center_x = (image_array.shape[1]) // 2
center_y = (image_array.shape[2]) // 2
center_z = (image_array.shape[0]) / 2 # 分别计算出xyz方向上的中心
print("center_x=", center_x, "center_y=", center_y, "center_z=",center_z)
center_x = center_x - vol2
image_array = image_array[:, center_x - vol3:center_x + vol3, center_y - xy:center_y + xy]
label_array = label_array[:, center_x - vol3:center_x + vol3, center_y - xy:center_y + xy] # 在XY裁剪出一个256 * 256的区域
#####只需要保存有标签的序列就行了
z = np.any(label_array, axis=(1, 2))
start_slice, end_slice = np.where(z)[0][[0, -1]]
# 截取保留区域
image_array = image_array[start_slice:end_slice + 1, :, :]
label_array = label_array[start_slice:end_slice + 1, :, :]
# print("Preprocessed shape:",ct_array.shape,seg_array.shape)
new_image = sitk.GetImageFromArray(image_array)
new_image.SetDirection(image.GetDirection())
new_image.SetOrigin(image.GetOrigin())
new_image.SetSpacing(image.GetSpacing())
new_seg = sitk.GetImageFromArray(label_array)
new_seg.SetDirection(label.GetDirection())
new_seg.SetOrigin(label.GetOrigin())
new_seg.SetSpacing(label.GetSpacing())
sitk.WriteImage(new_image, "crop/test4/ct/volume-{}.nii".format(str(i)))
sitk.WriteImage(new_seg, "crop/test4/label/segmentation-{}.nii.gz".format(str(i)))
nii2d("crop/test4/ct/volume-" + str(i) + ".nii", "crop/png_ct/", i)
mask2d("crop/test4/label/segmentation-" + str(i) + ".nii.gz", "crop/png_label/", i)
"""对于label来说是ok的,但是对于那个来说不行"""