①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 18:59:18 浏览: 87
好的,根据您的要求,我会帮您处理LiTS2017数据集并保存到指定文件夹。以下是处理步骤:
1. 导入必要的库
```python
import os
import numpy as np
import nibabel as nib
import cv2
```
2. 定义函数
```python
def crop_image(image, mask):
"""
将图像和标签裁剪为单个肝脏区域
"""
image_shape = image.shape
mask_shape = mask.shape
assert image_shape == mask_shape, "Image and mask shape do not match"
# 只保留肝脏区域
mask[mask > 0] = 1
# 计算肝脏区域的bounding box
x, y, z = np.where(mask > 0)
x_min, x_max = np.min(x), np.max(x)
y_min, y_max = np.min(y), np.max(y)
z_min, z_max = np.min(z), np.max(z)
# 裁剪图像和标签
image = image[x_min:x_max + 1, y_min:y_max + 1, z_min:z_max + 1]
mask = mask[x_min:x_max + 1, y_min:y_max + 1, z_min:z_max + 1]
return image, mask
def remove_small_area(image, mask, threshold):
"""
移除标签中无肝脏的图片以及肝脏在图片中面积占比小于threshold的切片
"""
image_shape = image.shape
mask_shape = mask.shape
assert image_shape == mask_shape, "Image and mask shape do not match"
new_image = []
new_mask = []
for i in range(image_shape[2]):
# 计算肝脏面积占比
area = np.sum(mask[:, :, i])
area_ratio = area / (image_shape[0] * image_shape[1])
# 移除标签中无肝脏的图片以及肝脏在图片中面积占比小于threshold的切片
if area == 0 or area_ratio < threshold:
continue
# 将图像和标签保存到列表中
new_image.append(image[:, :, i])
new_mask.append(mask[:, :, i])
new_image = np.array(new_image)
new_mask = np.array(new_mask)
return new_image, new_mask
def save_image(image, save_path):
"""
将图像保存为png格式
"""
image = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
cv2.imwrite(save_path, image)
def process_data(image_path, mask_path, save_folder):
"""
处理数据集
"""
# 加载图像和标签
image = nib.load(image_path).get_fdata()
mask = nib.load(mask_path).get_fdata()
# 将图像和标签裁剪为单个肝脏区域
image, mask = crop_image(image, mask)
# 移除标签中无肝脏的图片以及肝脏在图片中面积占比小于2%的切片
image, mask = remove_small_area(image, mask, 0.02)
# 将3D图像和标签转换为2D、RGB三通道的png格式的图像和2D单通道的png格式标签
for i in range(image.shape[2]):
image_save_path = os.path.join(save_folder, "image", f"{i}.png")
mask_save_path = os.path.join(save_folder, "mask", f"{i}.png")
image_slice = image[:, :, i]
mask_slice = mask[:, :, i]
# 将3D图像转换为2D、RGB三通道的png格式的图像
image_slice = np.stack([image_slice] * 3, axis=-1)
save_image(image_slice, image_save_path)
# 将3D标签转换为2D单通道的png格式标签
save_image(mask_slice, mask_save_path)
```
3. 处理数据集并保存到指定文件夹
```python
# 定义数据集路径和保存路径
data_folder = "E:/LiTS2017"
save_folder = "E:/2D-LiTS2017"
# 创建保存图像和标签的文件夹
os.makedirs(os.path.join(save_folder, "image"), exist_ok=True)
os.makedirs(os.path.join(save_folder, "mask"), exist_ok=True)
# 处理数据集
for i in range(1, 131):
# 构造图像和标签的文件路径
image_path = os.path.join(data_folder, f"training_batch1/volume-{i:03d}.nii")
mask_path = os.path.join(data_folder, f"training_batch2/segmentation-{i:03d}.nii")
# 处理数据集并保存到指定文件夹
process_data(image_path, mask_path, save_folder)
```
处理完成后,您将在E:\2D-LiTS2017文件夹中找到转换好的数据集。其中,image文件夹中保存的是2D、RGB三通道的png格式的图像,mask文件夹中保存的是2D单通道的png格式标签。
阅读全文