①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 14:59:14 浏览: 55
医学图像分割数据:肝肿瘤分割基(LiTS)切片分割【包含切片后的数据集(3类别)、标签文件、可视化代码】
以下是Python代码实现上述要求:
```python
import os
import glob
import numpy as np
import SimpleITK as sitk
from PIL import Image
import cv2
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
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
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"))
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"))
image_path = os.path.join(data_path, "Training Batch 1", "*.nii")
label_path = os.path.join(data_path, "Training Batch 2", "*.nii")
image_files = sorted(glob.glob(image_path))
label_files = sorted(glob.glob(label_path))
for i in range(len(image_files)):
image_array, label_array = load_data(image_files[i], label_files[i])
save_images(image_array, label_array, save_path)
```
注意,裁剪单个肝脏区域和移除肝脏面积占比小于2%的切片的方法可能需要根据数据集的特点进行调整。同时,代码中使用了OpenCV库的一些函数,需要先安装并导入该库。
阅读全文