请将我的数据集里面的3D图像变成2D、RGB三通道、的png格式的图像(要求调整窗宽windowWidth=400, windowCenter=40,以突出所需区域的细节)。数据集里面的3D标签变成(要求背景灰度值0、肝脏灰度值1、肝脏肿瘤灰度值2的)2D的png格式标签。 LiTS2017数据集里面包含Training Batch 1和Training Batch 2两个文件夹。Training Batch 1文件夹里面有图像,图像的拓展名为.nii。Training Batch 2文件夹里面有标签,标签拓展名为.nii。 LiTS2017数据集的路径为C:\Users\Administrator\Desktop\LiTS2017。 保存路径为C:\Users\Administrator\Desktop\2D-LiTS2017,请帮我创建好对应文件夹,并且将转换好的数据保存到对应的文件夹。
时间: 2024-02-03 12:14:21 浏览: 59
好的,我可以帮你完成这个任务。你需要安装SimpleITK和numpy这两个python包,如果你还没有安装,可以通过以下命令进行安装:
```
pip install SimpleITK numpy
```
然后你可以使用以下代码将.nii文件转换为2D的png格式的图像,并将其保存到指定的文件夹中:
```python
import os
import numpy as np
import SimpleITK as sitk
# 定义窗宽和窗位
windowWidth = 400
windowCenter = 40
# 定义数据集路径和保存路径
data_path = r'C:\Users\Administrator\Desktop\LiTS2017'
save_path = r'C:\Users\Administrator\Desktop\2D-LiTS2017'
# 创建保存路径
if not os.path.exists(save_path):
os.makedirs(save_path)
if not os.path.exists(os.path.join(save_path, 'image')):
os.makedirs(os.path.join(save_path, 'image'))
if not os.path.exists(os.path.join(save_path, 'label')):
os.makedirs(os.path.join(save_path, 'label'))
# 遍历数据集文件夹
for filename in os.listdir(os.path.join(data_path, 'Training Batch 1')):
# 读取.nii文件
img = sitk.ReadImage(os.path.join(data_path, 'Training Batch 1', filename))
# 获取图像数组
img_array = sitk.GetArrayFromImage(img)
# 获取图像像素间距
img_spacing = img.GetSpacing()
# 获取图像原点坐标
img_origin = img.GetOrigin()
# 获取图像方向
img_direction = img.GetDirection()
# 遍历图像数组
for i in range(img_array.shape[0]):
# 获取2D图像
slice_img = img_array[i, :, :]
# 将像素值缩放到0-255之间
slice_img = (slice_img - np.min(slice_img)) / (np.max(slice_img) - np.min(slice_img)) * 255
# 调整窗宽窗位
slice_img = np.clip(slice_img, windowCenter - 0.5 - (windowWidth - 1) / 2, windowCenter - 0.5 + (windowWidth - 1) / 2)
slice_img = (slice_img - (windowCenter - 0.5)) / (windowWidth - 1) + 0.5
slice_img = np.clip(slice_img, 0, 1)
slice_img = (slice_img * 255).astype(np.uint8)
# 保存为png格式的图像
sitk_img = sitk.GetImageFromArray(slice_img)
sitk_img.SetSpacing((img_spacing[1], img_spacing[2]))
sitk_img.SetOrigin((img_origin[1], img_origin[2], i))
sitk_img.SetDirection(img_direction)
sitk.WriteImage(sitk_img, os.path.join(save_path, 'image', filename[:-4] + '_' + str(i) + '.png'))
# 遍历数据集文件夹
for filename in os.listdir(os.path.join(data_path, 'Training Batch 2')):
# 读取.nii文件
img = sitk.ReadImage(os.path.join(data_path, 'Training Batch 2', filename))
# 获取图像数组
img_array = sitk.GetArrayFromImage(img)
# 获取图像像素间距
img_spacing = img.GetSpacing()
# 获取图像原点坐标
img_origin = img.GetOrigin()
# 获取图像方向
img_direction = img.GetDirection()
# 遍历图像数组
for i in range(img_array.shape[0]):
# 获取2D标签
slice_img = img_array[i, :, :]
# 将像素值缩放到0-255之间
slice_img = (slice_img - np.min(slice_img)) / (np.max(slice_img) - np.min(slice_img)) * 255
# 将标签值映射到0-2之间
slice_img[slice_img == 1] = 2
slice_img[slice_img == 2] = 1
slice_img = slice_img.astype(np.uint8)
# 保存为png格式的标签
sitk_img = sitk.GetImageFromArray(slice_img)
sitk_img.SetSpacing((img_spacing[1], img_spacing[2]))
sitk_img.SetOrigin((img_origin[1], img_origin[2], i))
sitk_img.SetDirection(img_direction)
sitk.WriteImage(sitk_img, os.path.join(save_path, 'label', filename[:-4] + '_' + str(i) + '.png'))
```
这段代码会遍历数据集文件夹中的.nii文件,将其转换为2D的png格式的图像或标签,并将其保存到指定的文件夹中。注意,这段代码只是对LiTS2017数据集进行了处理,如果你有其他数据集需要处理,可能需要对代码进行适当修改。
阅读全文