我的LiTS2017数据集的路径为E:\LiTS2017。保存路径为E:\2D-LiTS2017,帮我创建保存图像与标签的文件夹,并且将转换好的数据保存到对应的文件夹。 我的LiTS2017数据集里面有命名为Training Batch 1的文件夹和命名为Training Batch 2的文件夹。Training Batch 1文件夹里面有图像,图像的拓展名为.nii。Training Batch 2文件夹里面有标签,标签拓展名为.nii。 请将我的LiTS2017数据集的3D图像切片成2D、RGB三通道的png格式的图像。数据集的3D标签变成2D单通道的png格式标签。segmentation部分中肝脏加上肿瘤在图中面积占比小于2%的切片不保留。
时间: 2024-02-20 18:00:54 浏览: 137
好的,我先解析您的要求,您的LiTS2017数据集的路径为E:\LiTS2017,您想要将数据集转换成2D、RGB三通道的png格式的图像,并且将数据保存到E:\2D-LiTS2017文件夹中,其中Training Batch 1文件夹中包含图像,拓展名为.nii,Training Batch 2文件夹中包含标签,拓展名为.nii。同时,将肝脏加上肿瘤在图中面积占比小于2%的切片不保留。我将为您完成以下步骤:
1. 创建保存图像与标签的文件夹
```
import os
save_path = 'E:\\2D-LiTS2017'
if not os.path.exists(save_path):
os.makedirs(os.path.join(save_path, 'image'))
os.makedirs(os.path.join(save_path, 'label'))
```
2. 将数据集的3D图像切片成2D、RGB三通道的png格式的图像。数据集的3D标签变成2D单通道的png格式标签。segmentation部分中肝脏加上肿瘤在图中面积占比小于2%的切片不保留。
```
import numpy as np
import SimpleITK as sitk
from PIL import Image
def rescale_array(arr):
arr_min = np.min(arr)
arr_max = np.max(arr)
return (arr - arr_min) / (arr_max - arr_min)
def save_slice(image_array, label_array, slice_num, save_path):
image_array = image_array[slice_num,:,:]
label_array = label_array[slice_num,:,:]
label_array[label_array > 0] = 1 # 将标签二值化
label_array = label_array.astype(np.uint8)
mask_array = label_array.copy()
mask_area = np.sum(mask_array) # 计算标签面积
if mask_area > image_array.shape[0]*image_array.shape[1]*0.02: # 如果标签面积占比小于2%,则不保存
image_array = rescale_array(image_array)
image_array = (image_array * 255).astype(np.uint8)
image_array = np.stack([image_array]*3, axis=-1) # 将灰度图转换为RGB图
image_array = Image.fromarray(image_array)
label_array = Image.fromarray(label_array)
image_array.save(os.path.join(save_path, 'image', 'img_%03d.png'%slice_num))
label_array.save(os.path.join(save_path, 'label', 'label_%03d.png'%slice_num))
for batch_num in range(1,3):
image_path = os.path.join('E:\\LiTS2017', 'Training Batch %d'%batch_num, 'volume-%d.nii'%batch_num)
label_path = os.path.join('E:\\LiTS2017', 'Training Batch %d'%batch_num, 'segmentation-%d.nii'%batch_num)
image = sitk.ReadImage(image_path)
label = sitk.ReadImage(label_path)
image_array = sitk.GetArrayFromImage(image)
label_array = sitk.GetArrayFromImage(label)
for slice_num in range(image_array.shape[0]):
save_slice(image_array, label_array, slice_num, save_path)
```
运行以上代码后,您将得到E:\2D-LiTS2017文件夹,其中包含image文件夹和label文件夹。image文件夹中包含切片图像,label文件夹中包含切片标签。其中,保留了肝脏加上肿瘤在图中面积占比大于2%的切片。
阅读全文