我的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 17:00:43 浏览: 17
好的,以下是代码实现:
```python
import os
import numpy as np
import nibabel as nib
from PIL import Image
# 设置数据集路径和保存路径
data_path = "E:/LiTS2017"
save_path = "E:/2D-LiTS2017"
# 创建保存图像和标签的文件夹
if not os.path.exists(os.path.join(save_path, "image")):
os.makedirs(os.path.join(save_path, "image"))
if not os.path.exists(os.path.join(save_path, "label")):
os.makedirs(os.path.join(save_path, "label"))
# 读取数据集
for i in range(1, 3):
data_dir = os.path.join(data_path, "Training Batch {}".format(i))
image_files = sorted(os.listdir(os.path.join(data_dir, "volume")))
label_files = sorted(os.listdir(os.path.join(data_dir, "segmentation")))
for j in range(len(image_files)):
# 读取图像和标签
image_data = nib.load(os.path.join(data_dir, "volume", image_files[j])).get_fdata()
label_data = nib.load(os.path.join(data_dir, "segmentation", label_files[j])).get_fdata()
# 去掉肝脏和肿瘤面积占比小于2%的切片
liver_mask = label_data == 1
tumor_mask = label_data == 2
if np.sum(liver_mask) == 0 or np.sum(tumor_mask) / np.sum(liver_mask) < 0.02:
continue
# 将3D图像切片成2D图像
for k in range(image_data.shape[2]):
# 将图像和标签转换为png格式
image = Image.fromarray((image_data[:, :, k] * 255).astype(np.uint8)).convert("RGB")
label = Image.fromarray((label_data[:, :, k] * 255).astype(np.uint8)).convert("L")
# 保存图像和标签
image.save(os.path.join(save_path, "image", "{}_{}.png".format(i, j * image_data.shape[2] + k)))
label.save(os.path.join(save_path, "label", "{}_{}.png".format(i, j * image_data.shape[2] + k)))
```
该代码将数据集中的3D图像切片成2D图像,并将图像和标签转换为png格式保存在指定的文件夹中。同时,它还会去掉肝脏和肿瘤面积占比小于2%的切片。