如何将.nii文件用python来转为png
时间: 2024-01-30 14:03:35 浏览: 381
我们可以使用Python中的`nibabel`库和`matplotlib`库来将.nii文件转换为png格式的图像。以下是基本的代码示例:
```python
import nibabel as nib
import matplotlib.pyplot as plt
# 加载nii文件
img = nib.load('example.nii')
# 获取图像数据
data = img.get_fdata()
# 显示图像
plt.imshow(data[:,:,0], cmap='gray')
# 保存为png格式的图像
plt.savefig('example.png')
```
在这个示例中,我们首先使用`nibabel`库中的`load`函数来加载.nii文件,然后使用`get_fdata`方法获取图像数据。最后,我们使用`matplotlib`库的`imshow`函数来显示图像,并使用`savefig`方法将其保存为png格式的图像。需要注意的是,由于.nii文件可能包含多个图像,因此在显示和保存时需要指定需要处理的图像的位置或索引。
相关问题
医学图像nii文件转为png格式
### 将医学图像 NII 文件转换为 PNG 格式的流程
为了实现这一目标,通常会采用 Python 结合 VTK 或者 SimpleITK 库来完成此操作。以下是具体方法:
#### 方法一:使用 Python 和 VTK 库批量转换 NII 至 PNG 图像
这种方法能够高效地将大量医学影像数据转化为易于处理的标准图片格式,从而便于进一步的研究工作[^1]。
```python
import vtk
from vtk.util.numpy_support import vtk_to_numpy
import numpy as np
import os
from PIL import Image
def nii_to_png(input_filename, output_dir):
reader = vtk.vtkNIFTIImageReader()
reader.SetFileName(input_filename)
reader.Update()
image_data = reader.GetOutput()
dimensions = image_data.GetDimensions()
for i in range(dimensions[2]):
extractor = vtk.vtkImageExtractComponents()
extractor.SetInputData(image_data)
extractor.SetComponents(0)
slice_extractor = vtk.vtkImageSliceExtractor()
slice_extractor.SetInputConnection(extractor.GetOutputPort())
slice_extractor.SetSliceNumber(i)
slice_extractor.Update()
converted_image = slice_extractor.GetOutput()
array_view = vtk_to_numpy(converted_image.GetPointData().GetScalars()).reshape(-1,dimensions[0],dimensions[1])
img_array = (array_view * 255 / np.max(array_view)).astype('uint8')
im = Image.fromarray(img_array.squeeze(), mode='L')
if not os.path.exists(output_dir+f"/z/{i}"):
os.makedirs(output_dir+f"/z/{i}")
im.save(f"{output_dir}/z/{i}/{os.path.basename(os.path.splitext(input_filename)[0])}_{i}.png")
if __name__ == "__main__":
input_file_path = "path/to/your/nii/file.nii"
output_directory = "./converted_images/"
nii_to_png(input_file_path,output_directory)
```
上述脚本实现了读取 `.nii` 文件,并沿 Z 轴逐层提取二维切片,最终将其保存为 PNG 文件的功能[^2]。
#### 方法二:利用 ITK-SNAP 工具手动选择特定视窗进行转换
对于只需要单独处理某个视角的情况,可以通过可视化软件如 ITK-SNAP 来加载 `*.nii.gz` 数据集,在界面内挑选所需观察的角度(比如矢状面 Sagittal),之后导出所选平面内的所有切片作为独立的 PNG 文件[^4]。
#### 方法三:基于 SimpleITK 的自动化解决方案
SimpleITK 是另一个强大的开源库,它提供了简单易用的接口来进行医学图像的操作。这里给出一段简单的代码片段用于说明如何快速实现从 NIfTI 到 PNG 的转变[^3]:
```python
import SimpleITK as sitk
import matplotlib.pyplot as plt
import os
def save_slices_as_png(image,slice_indices,directory_name="slices",file_prefix="slice_"):
try:
os.mkdir(directory_name)
except FileExistsError:
pass
for index in slice_indices:
slice_img = image[:,:,index]
fig = plt.figure(figsize=(7,7))
plt.imshow(sitk.GetArrayViewFromImage(slice_img),cmap=plt.cm.gray)
plt.axis('off') # Hide axes ticks and labels.
plt.savefig(os.path.join(directory_name,f'{file_prefix}{str(index)}.png'),bbox_inches='tight',pad_inches=0)
image = sitk.ReadImage("example.nii")
size = image.GetSize()[2]
save_slices_as_png(image=list(range(size)),directory_name="./output/")
```
这段程序同样完成了按照指定索引范围截取三维体素中的各个层面,并依次存储成静态图形的任务。
LiTS2017数据集的路径为D:\BaiduNetdiskDownload\LiTS2017,将数据集的3D图像转换成2D的三通道png格式图像,3D标签转换成(背景灰度值0、肝脏灰度值1、肝脏肿瘤灰度值2的)2D的png格式标签。,LiTS2017数据集里面包含Training Batch 1和Training Batch 2两个文件夹,Training Batch 1文件夹里面有图像,图像的拓展名为.nii。Training Batch 2文件夹里面有标签,标签拓展名为.nii,保存路径为C:\Users\Administrator\Desktop\2D-LiTS2017,请帮我创建好对应文件夹,并且将转换好的保存到对应的文件夹
好的,可以使用以下Python代码来完成您的需求:
```python
import os
import nibabel as nib
import numpy as np
from PIL import Image
root_dir = r'D:\BaiduNetdiskDownload\LiTS2017'
save_dir = r'C:\Users\Administrator\Desktop\2D-LiTS2017'
# 创建对应文件夹
os.makedirs(os.path.join(save_dir, 'Training Batch 1'), exist_ok=True)
os.makedirs(os.path.join(save_dir, 'Training Batch 2'), exist_ok=True)
# 转换图像
for i in range(1, 131):
img_path = os.path.join(root_dir, 'Training Batch 1', f'volume-{i:03d}.nii')
img = nib.load(img_path).get_data()
img = np.transpose(img, (2, 0, 1)) # 转为Z轴为第一维度的顺序
for j in range(img.shape[0]):
save_path = os.path.join(save_dir, 'Training Batch 1', f'volume-{i:03d}-{j:03d}.png')
Image.fromarray(img[j]).convert('L').save(save_path)
# 转换标签
for i in range(1, 131):
label_path = os.path.join(root_dir, 'Training Batch 2', f'segment-{i:03d}.nii')
label = nib.load(label_path).get_data()
label = np.transpose(label, (2, 0, 1)) # 转为Z轴为第一维度的顺序
for j in range(label.shape[0]):
save_path = os.path.join(save_dir, 'Training Batch 2', f'segment-{i:03d}-{j:03d}.png')
label_2d = np.zeros_like(label[j], dtype=np.uint8)
label_2d[label[j] == 1] = 255 # 肝脏标签设为255
label_2d[label[j] == 2] = 128 # 肝脏肿瘤标签设为128
Image.fromarray(label_2d).convert('L').save(save_path)
```
这段代码使用了nibabel库来读取.nii格式的图像和标签,并将其转换为numpy数组。然后使用PIL库将numpy数组转换为png格式的图像和标签,并保存到对应的文件夹中。请注意,由于图像和标签的文件名中包含了序号,因此我们使用了f-string来动态生成文件名。
希望这可以帮助到您。
阅读全文
相关推荐











