①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格式标签。并将其裁剪为单个肝脏区域。同时,移除标签中无肝脏的图片以及肝脏在图片中面积占比小于2%的切片。
时间: 2024-02-20 14:59:12 浏览: 69
医学图像分割数据:肝肿瘤分割基(LiTS)切片分割【包含切片后的数据集(3类别)、标签文件、可视化代码】
抱歉,作为AI语言模型,我无法直接访问您的本地电脑并执行文件操作。您需要在本地电脑上安装Python并使用相应的库(如SimpleITK、numpy、PIL等)来完成这些操作。以下是一些基本步骤供您参考:
1. 创建保存图像与标签的文件夹:
```python
import os
data_path = "E:/LiTS2017"
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"))
```
2. 加载图像和标签数据:
```python
import SimpleITK as sitk
import numpy as np
def load_data(image_path, label_path):
image = sitk.ReadImage(image_path)
label = sitk.ReadImage(label_path)
image_array = sitk.GetArrayFromImage(image)
label_array = sitk.GetArrayFromImage(label)
return image_array, label_array
image_path = os.path.join(data_path, "Training Batch 1", "volume-*.nii")
label_path = os.path.join(data_path, "Training Batch 2", "segmentation-*.nii")
image_files = sorted(glob.glob(image_path))
label_files = sorted(glob.glob(label_path))
data = [(image_files[i], label_files[i]) for i in range(len(image_files))]
```
3. 将3D图像和标签变成2D、RGB三通道的png格式的图像和2D单通道的png格式标签:
```python
from PIL import Image
def save_images(image_array, label_array, save_path):
for i in range(image_array.shape[0]):
# 裁剪单个肝脏区域
if np.sum(label_array[i]) < 2:
continue
x, y, w, h = get_liver_roi(label_array[i])
image = image_array[i][x:x+w, y:y+h]
label = label_array[i][x:x+w, y:y+h]
# 移除肝脏面积占比小于2%的切片
if (np.sum(label) / label.size) < 0.02:
continue
# 将3D图像和标签变成2D图像和标签
for j in range(image.shape[0]):
image_j = Image.fromarray(image[j])
label_j = Image.fromarray(label[j])
# 将2D图像变成RGB三通道的png格式的图像
image_j = image_j.convert("RGB")
image_j.save(os.path.join(save_path, "images", f"{i+1:03d}_{j+1:03d}.png"))
# 将2D标签变成单通道的png格式标签
label_j.save(os.path.join(save_path, "labels", f"{i+1:03d}_{j+1:03d}.png"))
def get_liver_roi(label_slice):
# 获取肝脏区域的坐标和大小
x, y, w, h = 0, 0, 0, 0
label_slice = label_slice.astype(np.uint8)
contours, hierarchy = cv2.findContours(label_slice, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
max_area = 0
for contour in contours:
area = cv2.contourArea(contour)
if area > max_area:
max_area = area
x, y, w, h = cv2.boundingRect(contour)
return x, y, w, h
for image_path, label_path in data:
image_array, label_array = load_data(image_path, label_path)
save_images(image_array, label_array, save_path)
```
注意,裁剪单个肝脏区域和移除肝脏面积占比小于2%的切片的方法可能需要根据数据集的特点进行调整。同时,代码中使用了OpenCV库的一些函数,需要先安装并导入该库。
阅读全文