LiTS2017数据集里面包含Training Batch 1和Training Batch 2两个文件夹。Training Batch 1文件夹里面有图像,图像的拓展名为.nii。Training Batch 2文件夹里面有标签,标签拓展名为.nii。 请将我的LiTS2017数据集的3D图像变成2D、RGB三通道、的png格式的图像。数据集的3D标签变成2D单通道的png格式标签。 并将其裁剪为单个肝脏区域。同时,移除segmentation部分无肝脏以及肝脏在图中面积占比小于1.5%的切片,对数据集进行增强操作,如旋转、翻转、缩放等,以扩充数据集,提高模型的泛化能力。 LiTS2017数据集的路径为C:\Users\Administrator\Desktop\LiTS2017。 保存路径为C:\Users\Administrator\Desktop\2D-LiTS2017,请帮我创建好对应文件夹,并且将转换好的数据保存到对应的文件夹。
时间: 2024-02-11 18:05:54 浏览: 72
好的,这是一个比较复杂的任务,需要使用到许多 Python 库和图像处理技术。以下是一个可能的实现方案,你可以参考一下:
```python
import os
import numpy as np
import nibabel as nib
from PIL import Image
import scipy.ndimage as ndimage
# 定义数据集路径和保存路径
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)
# 定义图像分辨率和肝脏占比阈值
resolution = (512, 512)
area_threshold = 0.015 * resolution[0] * resolution[1]
# 定义旋转、翻转、缩放等增强操作
def random_rotation(image, label):
angle = np.random.uniform(-10, 10)
return ndimage.rotate(image, angle, reshape=False), ndimage.rotate(label, angle, reshape=False)
def random_flip(image, label):
if np.random.rand() < 0.5:
return np.fliplr(image), np.fliplr(label)
else:
return np.flipud(image), np.flipud(label)
def random_scale(image, label):
scale = np.random.uniform(0.8, 1.2)
height, width = image.shape[:2]
new_height, new_width = int(height * scale), int(width * scale)
image = ndimage.zoom(image, (new_height / height, new_width / width, 1), order=1)
label = ndimage.zoom(label, (new_height / height, new_width / width, 1), order=0)
return image[:resolution[0], :resolution[1], :], label[:resolution[0], :resolution[1], :]
# 遍历数据集中的所有图像和标签
for i in range(1, 131):
# 读取图像和标签
image_nii = nib.load(os.path.join(data_path, "Training Batch 1", "volume-%03d.nii" % i))
label_nii = nib.load(os.path.join(data_path, "Training Batch 2", "segmentation-%03d.nii" % i))
image = np.array(image_nii.dataobj)
label = np.array(label_nii.dataobj)
# 裁剪到单个肝脏区域
label = ndimage.binary_fill_holes(label > 0)
label = ndimage.binary_erosion(label, iterations=3)
label, _ = ndimage.label(label)
sizes = ndimage.sum(label, label, range(1, label.max() + 1))
label = (label == sizes.argmax() + 1).astype(np.uint8)
# 移除无肝脏的切片和小于阈值的切片
areas = ndimage.sum(label, label, range(1, label.max() + 1))
keep_slices = []
for j in range(label.shape[2]):
if areas[label[:, :, j].max()] >= area_threshold:
keep_slices.append(j)
image = image[:, :, keep_slices]
label = label[:, :, keep_slices]
# 对每个切片进行处理
for j in range(image.shape[2]):
# 将3D图像转换为2D RGB图像
slice_image = Image.fromarray(image[:, :, j])
slice_image = slice_image.resize(resolution, resample=Image.BILINEAR)
slice_image = np.array(slice_image.convert('RGB'))
# 将3D标签转换为2D单通道标签
slice_label = Image.fromarray(label[:, :, j])
slice_label = slice_label.resize(resolution, resample=Image.NEAREST)
slice_label = np.array(slice_label)
# 执行随机增强操作
slice_image, slice_label = random_rotation(slice_image, slice_label)
slice_image, slice_label = random_flip(slice_image, slice_label)
slice_image, slice_label = random_scale(slice_image, slice_label)
# 保存图像和标签
Image.fromarray(slice_image).save(os.path.join(save_path, "image_%03d_%03d.png" % (i, j)))
Image.fromarray(slice_label).save(os.path.join(save_path, "label_%03d_%03d.png" % (i, j)))
```
以上代码会遍历 LiTS2017 数据集中的所有图像和标签,对每个切片进行裁剪、转换、增强等处理,并将处理后的结果保存到指定的文件夹中。这个过程可能需要一些时间,取决于你的计算机性能和数据集大小。当代码执行完毕后,2D-LiTS2017 文件夹中应该包含许多命名为 `image_XXX_YYY.png` 和 `label_XXX_YYY.png` 的图像文件,其中 XXX 表示数据集中的序号,YYY 表示切片序号。你可以打开这些图像文件,查看它们是否符合预期。
阅读全文