本文细说一下医学图像中常见的文件格式之间的转换。

1.如何将raw/mhd转换为Nifti/nii

您应该能够使用 SimpleITK 来完成。你会做这样的事情:

import SimpleITK as sitkimg = sitk.ReadImage("input.mhd")
sitk.WriteImage(img, "output.nii")

如果python中没有SimpleITK,安装如下:

pip install SimpleITK

SimpleITK 尽最大努力保留所有标头信息,尽管它并不完美。体素尺寸将被保留。

2.如何将单标签的Nifti/nii转换为stl

使用voxelfuse和nibabel来完成,你需要这样做:

from voxelfuse.voxel_model import VoxelModel
from voxelfuse.mesh import Mesh
from voxelfuse.primitives import generateMaterials
import nibabel# Load nifti mask and convert to numpy
mask_dir = "Synthetic-04.nii"  # Put the directory of the mask file here
mask_nifti = nibabel.load(mask_dir)
mask_npy = mask_nifti.get_fdata()# Convert all nonzero labels (i.e. lesion labels) to 1
mask_npy[mask_npy != 0] = 1# Convert to mesh and save
model = VoxelModel(mask_npy, generateMaterials(1))
mesh = Mesh.fromVoxelModel(model)
mesh.export("DSynthetic-04.stl")

3.如何将多标签的Nifti/nii转换为stl

简单的python代码,用于根据标签将一个分段的nii.gz文件转换为stl文件列表中。
分段的nii.gz文件包含一系列标签,例如1、2、4、5。然后代码可以使用simpleITK和vtk将这个单独的nii.gz文件转换成一系列的.stl文件来创建网格。

此代码可用于许多医学成像情况,作为处理客户端读取的输出的最后一步。标签不需要是连续的,但需要是数字(整数、浮点数…)

import vtk
import glob
import SimpleITK as sitk
import numpy as npif __name__ == '__main__':# can be done in a loop if you have multiple files to be processed, speed is guaranteed if GPU is used:)filename_nii =  'verse096_seg.nii.gz'filename = filename_nii.split(".")[0]# read all the labels present in the filemulti_label_image=sitk.ReadImage(filename_nii)img_npy = sitk.GetArrayFromImage(multi_label_image)labels = np.unique(img_npy)# read the filereader = vtk.vtkNIFTIImageReader()reader.SetFileName(filename_nii)reader.Update()# for all labels presented in the segmented filefor label in labels:if int(label) != 0:# apply marching cube surface generationsurf = vtk.vtkDiscreteMarchingCubes()surf.SetInputConnection(reader.GetOutputPort())surf.SetValue(0, int(label)) # use surf.GenerateValues function if more than one contour is available in the filesurf.Update()#smoothing the meshsmoother= vtk.vtkWindowedSincPolyDataFilter()if vtk.VTK_MAJOR_VERSION <= 5:smoother.SetInput(surf.GetOutput())else:smoother.SetInputConnection(surf.GetOutputPort())# increase this integer set number of iterations if smoother surface wantedsmoother.SetNumberOfIterations(30) smoother.NonManifoldSmoothingOn()smoother.NormalizeCoordinatesOn() #The positions can be translated and scaled such that they fit within a range of [-1, 1] prior to the smoothing computationsmoother.GenerateErrorScalarsOn()smoother.Update()# save the outputwriter = vtk.vtkSTLWriter()writer.SetInputConnection(smoother.GetOutputPort())writer.SetFileTypeToASCII()# file name need to be changed# save as the .stl file, can be changed to other surface mesh filewriter.SetFileName(f'{filename}_{label}.stl')writer.Write()

4.图像读写

SimpleITK的图像读取器和写入器支持多种文件格式。对特定格式的支持由特定ITK ImageIO类处理。默认情况下,根据文件名后缀和/或文件头的内容自动确定特定文件的ImageIO。高级SimpleITK安装可以配置或扩展SimpleITK支持的文件格式。可以使用GetRegisteredImageIOs()方法找到已注册的ImageIO的列表,内容如下:

BMPImageIO ( *.bmp, *.BMP )
BioRadImageIO ( *.PIC, *.pic )
Bruker2dseqImageIO
GDCMImageIO
GE4ImageIO
GE5ImageIO
GiplImageIO ( *.gipl *.gipl.gz)
HDF5ImageIO
JPEGImageIO ( *.jpg, *.JPG, *.jpeg, *.JPEG )
LSMImageIO ( *.tif, *.TIF, *.tiff, *.TIFF, *.lsm, *.LSM )
MINCImageIO ( *.mnc, *.MNC )
MRCImageIO ( *.mrc, *.rec )
MetaImageIO ( *.mha, *.mhd )
NiftiImageIO ( *.nia, *.nii, *.nii.gz, *.hdr, *.img, *.img.gz )
NrrdImageIO ( *.nrrd, *.nhdr )
PNGImageIO ( *.png, *.PNG )
StimulateImageIO
TIFFImageIO ( *.tif, *.TIF, *.tiff, *.TIFF )
VTKImageIO ( *.vtk )

使用 SimpleITK 的 ImageFileReader 和 ImageFileWriter 类的读写示例:

import SimpleITK as sitk
inputImageFileName = "3.mhd"
outputImageFileName = "3.tiff"
reader = sitk.ImageFileReader()
reader.SetImageIO("PNGImageIO")
reader.SetFileName(inputImageFileName)
image = reader.Execute();writer = sitk.ImageFileWriter()
writer.SetFileName(outputImageFileName)
writer.Execute(image)

上面的示例指定使用PNGImageIO读取文件。如果省略了这一行,SimpleITK将根据文件名的后缀和/或文件头自动决定使用哪个IO。
使用SimpleITK过程化接口的一个更紧凑的示例:

import SimpleITK as sitk
inputImageFileName = "3.mhd"
outputImageFileName = "3.tiff"
image = sitk.ReadImage(inputImageFileName, imageIO="PNGImageIO")
sitk.WriteImage(image, outputImageFileName)

ITK入门教程(17)nii,mhd,stl之间的相互转换相关推荐

  1. ITK入门教程(13)点集之得到点中的存储数据

    目录 1.概述 2.过程讲解 3.代码 4.结果 1.概述 Itk::PointSet 类是与图像类交互的.因此点集中的点可以很方便地保存从图像计算得到的值.与点相关的值被指定为PixelType像素 ...

  2. ITK入门教程(12)点集之得到存储的点

    目录 1.概述 2.过程 3.代码 4.结果 1.概述 Itk::PointSet 类使用一个内部容器来管理itk::Points的存储.一般来说,通过使用点容器的直接访问方法来管理点将更加有效. 2 ...

  3. ITK入门教程(15)向量作为像素类型

    目录 1.概述 2.过程详解 3.代码 4.结果展示 1.概述 这个例子阐述了如何参数化一个点集来管理一个特定的像素类型.将向量值和点相关联以创建一个几何表示是很普遍的. 下面的代码展示了如何使用向量 ...

  4. ITK入门教程(4)ITK图像读写

    主要内容 1. 常见的医学图像格式 2. ITK的数据处理管道结构 3. ITK图像读写机制 4. RGB图像的读写程序示例 5. 读写3维mhd图像 1. 常见的医学图像格式 2. ITK的数据处理 ...

  5. ITK入门教程(7)ITK定义原点和间距

    主要内容 1.概述 2.代码实现 3.结果 参考目录 1.概述 尽管ITK可以用来执行通用图像处理的任务,但是这个工具包的主要目的是处理医学图像数据.因此关于图像的额外信息是强制性要求的.尤其是与像素 ...

  6. ITK入门教程(9)ITK向量图像

    内容提要 1.概述 2.代码 3.结果 参考目录 1.概述 许多图像处理任务要求非标量像素类型的图像,一个常见的例子就是向量图像.图像类型要求能够表示标量图像的梯度.下面的代码阐述了如何实例化和使用向 ...

  7. ITK入门教程(11)点集之创建一个点集

    目录 1.概述 2.过程 3.代码 4.结果 1.概述 Itk::PointSet 是一种在n 维空间中以点集的形式来表示几何图形的基类.它是为itk::Mesh提供操作点集的必要方法的基类.点具有和 ...

  8. ITK入门教程(6)ITK图像数据访问与修改(低效版本)

    主要内容 1.概述 2.代码展示 3.结果展示 参考目录 1.概述 本节阐述SetPixel( )和GetPixel( )方法的用法.这两个方法可以直接访问图像中包含的像素数据.考虑到这两种方法相对缓 ...

  9. ITK入门教程(10)ITK从缓冲器中导入图像数据

    目录 1.概述 2.过程分析 3.代码样例 4.结果展示 1.概述 这个例子阐述了如何导入数据到itk::Image类中.这在和其它软件系统接口时非常有用.许多系统使用连续的内存块作为图像像素数据的缓 ...

最新文章

  1. Xampp安装时需注意的事项
  2. 得到课程《组织行为学》学习笔记07
  3. spark搭建和使用,处理massive文件
  4. python线程与进程
  5. 嵌入式开发环境构建_设计模式:不可变的嵌入式构建器
  6. 长安渝北工厂机器人_长安UNI-T智能工厂:机器人、激光焊, 一分钟一台车
  7. 蓝桥杯 ALGO-28 算法训练 星际交流
  8. android论文前言,安卓论文大纲格式范文 安卓论文提纲怎么写
  9. MBlock-scartch开发环境搭建
  10. matlab数字调制蒙特卡洛仿真,AWGN信道下数字通信系统的蒙特卡洛仿真(基于matlab)...
  11. theano 全连接代码
  12. 秀米html编辑器,ueditor集成秀米编辑器
  13. Google analytics如何统计网站信息?
  14. error redefinition of 'xxx' 问题解决
  15. ArcGIS删除字段
  16. matlab中的a逆怎么使用方法,在MATLAB中,求矩阵A逆矩阵可用命令( )。
  17. 靶机实战(bulldog)
  18. kubernetes 节点维护 cordon, drain, uncordon
  19. 小白学Pytorch 系列--Torch API(1)
  20. [软件渲染器入门]六-应用纹理、背面剔除以及一些WebGL相关

热门文章

  1. 【UiBot】RPA定时触发:机器人如何在指定时间执行任务?
  2. prepend和append同时使用的时候,prepend中的内容不显示
  3. 安利!快速识别图像光学标识!Aspose.OMR助你获取图像中的数据
  4. H5新特性--日历插件的使用案例
  5. 智能手机之硬件开发知识篇二
  6. Launcher3桌面开发(5)-Launcher3 负一屏的定制开发
  7. flutter 常用的第三方组件
  8. Mathtype矩阵中的省略号不展示
  9. linux中的suid权限,linux suid权限问题
  10. 计算机领域创新事例,体现创新精神的经典案例—VAIO品牌的故事