①LiTS2017数据集里面包含Training Batch 1和Training Batch 2两个文件夹。Training Batch 1文件夹里面有图像,图像的拓展名为.nii。Training Batch 2文件夹里面有标签,标签拓展名为.nii。 ②请将我的LiTS2017数据集的3D图像变成2D、RGB三通道的png格式的图像。数据集的3D标签变成2D单通道的png格式标签。并将其裁剪为单个肝脏区域。同时,移除标签中无肝脏的图片以及肝脏在图片中面积占比小于2%的切片。 ③LiTS2017数据集的路径为E:\LiTS2017。保存路径为E:\2D-LiTS2017,帮我创建保存图像与标签的文件夹,并且将转换好的数据保存到对应的文件夹。
时间: 2024-02-20 09:59:29 浏览: 21
好的,根据您的要求,我理解您需要进行以下操作:
1. 读取LiTS2017数据集中的.nii文件
2. 将3D图像转换为2D、RGB三通道的png格式的图像
3. 将3D标签转换为2D单通道的png格式标签
4. 对图像进行裁剪,只保留单个肝脏区域
5. 移除标签中无肝脏的图片以及肝脏在图片中面积占比小于2%的切片
6. 保存转换好的数据到指定文件夹
以下是处理步骤的Python代码:
```python
import os
import numpy as np
import nibabel as nib
from PIL import Image
# 创建保存图像与标签的文件夹
save_path = "E:/2D-LiTS2017"
if not os.path.exists(save_path):
os.makedirs(os.path.join(save_path, "images"))
os.makedirs(os.path.join(save_path, "labels"))
# 读取.nii文件
def load_nii(file_path):
img_nii = nib.load(file_path)
img = img_nii.get_fdata()
return img
# 将3D图像转换为2D、RGB三通道的png格式的图像
def save_image(image, file_name):
image = (image * 255).astype(np.uint8)
if image.shape[2] == 3:
image = Image.fromarray(image, mode="RGB")
else:
image = Image.fromarray(image[:, :, 0], mode="L")
image = image.convert("RGB")
image.save(os.path.join(save_path, "images", file_name))
# 将3D标签转换为2D单通道的png格式标签
def save_label(label, file_name):
label = (label * 255).astype(np.uint8)
label = Image.fromarray(label[:, :, 0], mode="L")
label.save(os.path.join(save_path, "labels", file_name))
# 对图像进行裁剪,只保留单个肝脏区域
def crop_image(image, label):
z, y, x = np.nonzero(label)
z_min, z_max = z.min(), z.max()
y_min, y_max = y.min(), y.max()
x_min, x_max = x.min(), x.max()
return image[z_min:z_max+1, y_min:y_max+1, x_min:x_max+1], label[z_min:z_max+1, y_min:y_max+1, x_min:x_max+1]
# 移除标签中无肝脏的图片以及肝脏在图片中面积占比小于2%的切片
def remove_small_slice(image, label):
label_sum = np.sum(label)
if label_sum == 0:
return True
else:
liver_ratio = label_sum / label.size
if liver_ratio < 0.02:
return True
return False
# 处理数据集
def process_dataset(data_path):
image_files = sorted(os.listdir(os.path.join(data_path, "Training Batch 1")))
label_files = sorted(os.listdir(os.path.join(data_path, "Training Batch 2")))
for idx in range(len(image_files)):
image_file = os.path.join(data_path, "Training Batch 1", image_files[idx])
label_file = os.path.join(data_path, "Training Batch 2", label_files[idx])
image = load_nii(image_file)
label = load_nii(label_file)
for z in range(image.shape[2]):
image_slice = image[:, :, z]
label_slice = label[:, :, z]
if remove_small_slice(image_slice, label_slice):
continue
image_slice, label_slice = crop_image(image_slice, label_slice)
file_name = "{}_{}.png".format(image_files[idx].replace(".nii", ""), z)
save_image(image_slice, file_name)
save_label(label_slice, file_name)
# 处理数据集
process_dataset("E:/LiTS2017")
```
请注意,由于LiTS2017数据集比较大,处理时间可能会比较长。另外,由于您没有提供具体的要求,以上代码仅供参考,如果需要对代码进行修改,请根据自己的需求进行调整。