医学图像nii文件转为png格式
时间: 2025-03-04 16:12:46 浏览: 81
### 将医学图像 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/")
```
这段程序同样完成了按照指定索引范围截取三维体素中的各个层面,并依次存储成静态图形的任务。
阅读全文
相关推荐












