①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:25 浏览: 18
好的,我明白了您的要求。基于您的要求,需要使用Python和一些图像处理库来完成数据集的处理。以下是处理过程:
1. 导入必要的库
我们需要使用nibabel库来读取.nii文件,使用numpy库来处理图像数据,使用PIL库来保存png格式图像。
```python
import os
import numpy as np
import nibabel as nib
from PIL import Image
```
2. 定义函数
接下来,我们定义一些函数来完成数据集的处理。其中,`load_nii`函数用来读取.nii文件,`save_png`函数用来保存png格式图像,`crop_liver`函数用来裁剪肝脏区域。
```python
def load_nii(filename):
"""Load nii file and return data"""
img = nib.load(filename)
data = img.get_fdata()
return data
def save_png(data, filename):
"""Save data as png format"""
im = Image.fromarray(data.astype(np.uint8))
im.save(filename)
def crop_liver(image, label):
"""Crop liver region and remove bad slices"""
# Thresholding
mask = label > 0
# Get bounding box
z, y, x = np.nonzero(mask)
zmin, zmax = z.min(), z.max()
ymin, ymax = y.min(), y.max()
xmin, xmax = x.min(), x.max()
# Crop image and label
image = image[zmin:zmax+1, ymin:ymax+1, xmin:xmax+1]
label = label[zmin:zmax+1, ymin:ymax+1, xmin:xmax+1]
# Remove bad slices
areas = np.sum(label, axis=(1, 2))
good_slices = np.where(areas > np.prod(label.shape[1:]) * 0.02)[0]
image = image[good_slices]
label = label[good_slices]
return image, label
```
3. 处理数据集
接下来,我们遍历数据集中的所有.nii文件,将其转换为2D、RGB三通道的png格式图像和2D单通道的png格式标签,并将其保存到对应的文件夹中。
```python
# 数据集路径
data_dir = 'E:/LiTS2017'
# 保存路径
save_dir = 'E:/2D-LiTS2017'
# 创建保存图像和标签的文件夹
os.makedirs(os.path.join(save_dir, 'image'), exist_ok=True)
os.makedirs(os.path.join(save_dir, 'mask'), exist_ok=True)
# 遍历数据集
for i in range(131):
# 读取图像和标签
image_file = os.path.join(data_dir, 'training', 'volume-%03d.nii' % i)
label_file = os.path.join(data_dir, 'training', 'segmentation-%03d.nii' % i)
image_data = load_nii(image_file)
label_data = load_nii(label_file)
# 裁剪肝脏区域
image_data, label_data = crop_liver(image_data, label_data)
# 将图像转换为2D、RGB三通道的png格式图像
image_data = image_data.transpose(1, 2, 0)
image_data = np.stack((image_data,) * 3, axis=-1)
# 将标签转换为2D单通道的png格式标签
label_data = label_data.transpose(1, 2, 0)
# 保存图像和标签
for j in range(image_data.shape[2]):
image_filename = os.path.join(save_dir, 'image', '%03d_%03d.png' % (i, j))
label_filename = os.path.join(save_dir, 'mask', '%03d_%03d.png' % (i, j))
save_png(image_data[:, :, j], image_filename)
save_png(label_data[:, :, j], label_filename)
```
以上就是处理数据集的完整代码。请将以上代码保存为一个.py文件,并在命令行中运行即可。