请将我的数据集里面的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 14:14:32 浏览: 79
mnist数据集转为png格式图片
5星 · 资源好评率100%
好的,可以使用Python中的SimpleITK库来实现对.nii文件的读取和处理,然后使用PIL库将三维图像转换成二维图像并保存成png格式。整个过程大概分为以下几个步骤:
1. 导入所需库:
```python
import os
import numpy as np
import SimpleITK as sitk
from PIL import Image
```
2. 定义一些函数:
```python
def window_transform(image, windowWidth, windowCenter, normal=False):
"""
将像素值重新缩放到指定的窗宽窗位范围内,用于增强图像可视化效果
"""
minWindow = float(windowCenter) - 0.5 * float(windowWidth)
new_img = (image - minWindow) / float(windowWidth)
if normal:
return new_img
new_img[new_img < 0] = 0
new_img[new_img > 1] = 1
return new_img
def resample_image(itk_image, out_spacing=(1.0, 1.0, 1.0), is_label=False):
"""
对图像进行重采样,使得图像在各个方向上的spacing相等
"""
original_spacing = itk_image.GetSpacing()
original_size = itk_image.GetSize()
out_size = [int(np.round(original_size[i] * (original_spacing[i] / out_spacing[i])))
for i in range(3)]
out_size = tuple(out_size)
if is_label:
resample = sitk.ResampleImageFilter()
resample.SetOutputSpacing(out_spacing)
resample.SetSize(out_size)
resample.SetOutputDirection(itk_image.GetDirection())
resample.SetOutputOrigin(itk_image.GetOrigin())
resample.SetTransform(sitk.Transform())
resample.SetDefaultPixelValue(0)
resample.SetInterpolator(sitk.sitkNearestNeighbor)
else:
resample = sitk.Resample(itk_image, out_size, sitk.Transform(),
sitk.sitkLinear, itk_image.GetOrigin(),
out_spacing, itk_image.GetDirection(), 0.0,
itk_image.GetPixelID())
return resample
def save_png(image_array, save_path):
"""
保存图像为png格式
"""
image_array = (image_array * 255).astype(np.uint8)
im = Image.fromarray(image_array)
im.save(save_path)
```
3. 读取数据集中的.nii文件并进行处理:
```python
# 数据集路径
data_path = 'C:/Users/Administrator/Desktop/LiTS2017'
# 保存路径
save_path = 'C:/Users/Administrator/Desktop/2D-LiTS2017'
os.makedirs(save_path, exist_ok=True)
os.makedirs(os.path.join(save_path, 'image'), exist_ok=True)
os.makedirs(os.path.join(save_path, 'label'), exist_ok=True)
# 窗宽窗位
windowWidth = 400
windowCenter = 40
# 遍历Training Batch 1文件夹下的所有.nii文件
for file_name in os.listdir(os.path.join(data_path, 'Training Batch 1')):
if file_name.endswith('.nii'):
# 读取.nii文件
itk_image = sitk.ReadImage(os.path.join(data_path, 'Training Batch 1', file_name))
# 对图像进行重采样
itk_image = resample_image(itk_image, out_spacing=(1.0, 1.0, 1.0))
# 将图像转换为数组并进行像素值缩放
image_array = sitk.GetArrayFromImage(itk_image)
image_array = window_transform(image_array, windowWidth=windowWidth, windowCenter=windowCenter)
# 将三维图像转换为二维图像并保存为png格式
for i in range(image_array.shape[0]):
save_png(image_array[i], os.path.join(save_path, 'image', f'{file_name[:-4]}_{i}.png'))
# 遍历Training Batch 2文件夹下的所有.nii文件
for file_name in os.listdir(os.path.join(data_path, 'Training Batch 2')):
if file_name.endswith('.nii'):
# 读取.nii文件
itk_image = sitk.ReadImage(os.path.join(data_path, 'Training Batch 2', file_name))
# 对图像进行重采样
itk_image = resample_image(itk_image, out_spacing=(1.0, 1.0, 1.0), is_label=True)
# 将图像转换为数组并进行像素值缩放
label_array = sitk.GetArrayFromImage(itk_image)
# 将三维标签转换为二维标签并保存为png格式
for i in range(label_array.shape[0]):
save_png(label_array[i], os.path.join(save_path, 'label', f'{file_name[:-4]}_{i}.png'))
```
以上代码应该可以实现你的需求,你可以根据自己的情况进行一些微调。
阅读全文