请将我的LiTS2017数据集的3D图像变成2D、RGB三通道、的png格式的图像。数据集的3D标签变成(要求背景灰度值0、肝脏灰度值1、肝脏肿瘤灰度值2的)2D的png格式标签。 LiTS2017数据集里面包含Training Batch 1和Training Batch 2两个文件夹。Training Batch 1文件夹里面有图像,图像的拓展名为.nii。Training Batch 2文件夹里面有标签,标签拓展名为.nii。 LiTS2017数据集的路径为C:\Users\Administrator\Desktop\LiTS2017。 保存路径为C:\Users\Administrator\Desktop\2D-LiTS2017,请帮我创建好对应文件夹,并且将转换好的数据保存到对应的文件夹。
时间: 2024-02-05 08:10:57 浏览: 64
好的,可以使用Python中的SimpleITK和numpy库来完成这个任务。以下是具体的代码实现:
```python
import os
import numpy as np
import SimpleITK as sitk
# 定义转换函数
def convert_3d_to_2d(in_path, out_path):
# 读取3D图像
image = sitk.ReadImage(in_path)
image_array = sitk.GetArrayFromImage(image)
# 将每个切片保存为png格式的2D图像
for i in range(image_array.shape[0]):
slice_array = image_array[i, :, :]
slice_image = sitk.GetImageFromArray(slice_array)
slice_path = os.path.join(out_path, f"{i+1:03}.png")
sitk.WriteImage(slice_image, slice_path)
# 定义标签转换函数
def convert_label_3d_to_2d(in_path, out_path):
# 读取3D标签
label = sitk.ReadImage(in_path)
label_array = sitk.GetArrayFromImage(label)
# 将每个切片保存为png格式的2D标签
for i in range(label_array.shape[0]):
slice_array = label_array[i, :, :]
# 将标签值映射到灰度值
slice_array[slice_array == 1] = 255 // 2 # 肝脏
slice_array[slice_array == 2] = 255 # 肝脏肿瘤
slice_array[slice_array == 0] = 0 # 背景
slice_image = sitk.GetImageFromArray(slice_array)
slice_path = os.path.join(out_path, f"{i+1:03}.png")
sitk.WriteImage(slice_image, slice_path)
# 定义文件夹路径
data_path = r"C:\Users\Administrator\Desktop\LiTS2017"
image_path = os.path.join(data_path, "Training Batch 1")
label_path = os.path.join(data_path, "Training Batch 2")
output_path = r"C:\Users\Administrator\Desktop\2D-LiTS2017"
# 创建输出文件夹
if not os.path.exists(output_path):
os.makedirs(output_path)
# 遍历图像文件夹,逐个转换图像
for file_name in os.listdir(image_path):
file_path = os.path.join(image_path, file_name)
if file_path.endswith(".nii"):
out_folder_name = os.path.splitext(file_name)[0]
out_folder_path = os.path.join(output_path, out_folder_name)
if not os.path.exists(out_folder_path):
os.makedirs(out_folder_path)
convert_3d_to_2d(file_path, out_folder_path)
# 遍历标签文件夹,逐个转换标签
for file_name in os.listdir(label_path):
file_path = os.path.join(label_path, file_name)
if file_path.endswith(".nii"):
out_folder_name = os.path.splitext(file_name)[0]
out_folder_path = os.path.join(output_path, out_folder_name)
if not os.path.exists(out_folder_path):
os.makedirs(out_folder_path)
convert_label_3d_to_2d(file_path, out_folder_path)
```
该脚本会遍历原始数据集的文件夹,逐个读取.nii格式的3D图像和标签,将它们转换成2D的png格式的图像和标签,并保存到对应的文件夹中。其中,图像文件夹和标签文件夹中的每个.nii文件都会被转换成一个同名的文件夹,里面包含了该.nii文件中每个切片的2D图像或标签。转换后的图像和标签都是RGB三通道的png格式,其中背景灰度值为0,肝脏灰度值为255//2,肝脏肿瘤灰度值为255。
阅读全文