请将我的LiTS2017数据集的3D图像变成2D、RGB三通道、的png格式的图像。数据集的3D标签变成2D的png格式标签。(要求背景灰度值0、肝脏灰度值1、肝脏肿瘤灰度值2的) 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 19:11:18 浏览: 100
好的,您可以使用以下Python代码来实现这个功能:
```python
import os
import numpy as np
import nibabel as nib
from PIL import Image
# 设置数据集路径和保存路径
data_path = 'C:/Users/Administrator/Desktop/LiTS2017'
save_path = 'C:/Users/Administrator/Desktop/2D-LiTS2017'
# 创建保存路径文件夹
if not os.path.exists(save_path):
os.makedirs(save_path)
if not os.path.exists(os.path.join(save_path, 'images')):
os.makedirs(os.path.join(save_path, 'images'))
if not os.path.exists(os.path.join(save_path, 'labels')):
os.makedirs(os.path.join(save_path, 'labels'))
# 加载3D图像和标签
for i in range(1, 3):
data_folder = os.path.join(data_path, 'Training Batch ' + str(i))
for file_name in os.listdir(data_folder):
if file_name.endswith('.nii'):
# 加载nii文件
img_nii = nib.load(os.path.join(data_folder, file_name))
img = img_nii.get_fdata()
# 将3D图像转换为2D图像
if img.shape[-1] > 1:
for j in range(img.shape[-1]):
img_slice = np.squeeze(img[:, :, j])
img_slice = np.uint8((img_slice - img_slice.min()) / (img_slice.max() - img_slice.min()) * 255)
img_rgb = np.stack((img_slice,)*3, axis=-1)
# 保存为png格式
img_save_path = os.path.join(save_path, 'images', file_name[:-4] + '_' + str(j) + '.png')
Image.fromarray(img_rgb).save(img_save_path)
else:
img_slice = np.squeeze(img)
img_slice = np.uint8((img_slice - img_slice.min()) / (img_slice.max() - img_slice.min()) * 255)
img_rgb = np.stack((img_slice,)*3, axis=-1)
# 保存为png格式
img_save_path = os.path.join(save_path, 'images', file_name[:-4] + '.png')
Image.fromarray(img_rgb).save(img_save_path)
elif file_name.endswith('.nii.gz'):
# 加载nii.gz文件
label_nii = nib.load(os.path.join(data_folder, file_name))
label = label_nii.get_fdata()
# 将3D标签转换为2D标签
if label.shape[-1] > 1:
for j in range(label.shape[-1]):
label_slice = np.squeeze(label[:, :, j])
label_slice = np.uint8(label_slice)
label_save_path = os.path.join(save_path, 'labels', file_name[:-7] + '_' + str(j) + '.png')
label_img = Image.fromarray(label_slice, mode='L')
# 将标签灰度值转为0/1/2
label_img = label_img.point(lambda p: p * 1 if p == 1 else p * 2)
label_img.save(label_save_path)
else:
label_slice = np.squeeze(label)
label_slice = np.uint8(label_slice)
label_save_path = os.path.join(save_path, 'labels', file_name[:-4] + '.png')
label_img = Image.fromarray(label_slice, mode='L')
# 将标签灰度值转为0/1/2
label_img = label_img.point(lambda p: p * 1 if p == 1 else p * 2)
label_img.save(label_save_path)
```
运行以上代码后,您将得到两个文件夹,一个是`images`,里面包含转换好的图像;另一个是`labels`,里面包含转换好的标签。注意,转换后的标签灰度值已经被转换为0、1、2。
阅读全文