ITK入门教程(17)nii,mhd,stl之间的相互转换
本文细说一下医学图像中常见的文件格式之间的转换。
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之间的相互转换相关推荐
- ITK入门教程(13)点集之得到点中的存储数据
目录 1.概述 2.过程讲解 3.代码 4.结果 1.概述 Itk::PointSet 类是与图像类交互的.因此点集中的点可以很方便地保存从图像计算得到的值.与点相关的值被指定为PixelType像素 ...
- ITK入门教程(12)点集之得到存储的点
目录 1.概述 2.过程 3.代码 4.结果 1.概述 Itk::PointSet 类使用一个内部容器来管理itk::Points的存储.一般来说,通过使用点容器的直接访问方法来管理点将更加有效. 2 ...
- ITK入门教程(15)向量作为像素类型
目录 1.概述 2.过程详解 3.代码 4.结果展示 1.概述 这个例子阐述了如何参数化一个点集来管理一个特定的像素类型.将向量值和点相关联以创建一个几何表示是很普遍的. 下面的代码展示了如何使用向量 ...
- ITK入门教程(4)ITK图像读写
主要内容 1. 常见的医学图像格式 2. ITK的数据处理管道结构 3. ITK图像读写机制 4. RGB图像的读写程序示例 5. 读写3维mhd图像 1. 常见的医学图像格式 2. ITK的数据处理 ...
- ITK入门教程(7)ITK定义原点和间距
主要内容 1.概述 2.代码实现 3.结果 参考目录 1.概述 尽管ITK可以用来执行通用图像处理的任务,但是这个工具包的主要目的是处理医学图像数据.因此关于图像的额外信息是强制性要求的.尤其是与像素 ...
- ITK入门教程(9)ITK向量图像
内容提要 1.概述 2.代码 3.结果 参考目录 1.概述 许多图像处理任务要求非标量像素类型的图像,一个常见的例子就是向量图像.图像类型要求能够表示标量图像的梯度.下面的代码阐述了如何实例化和使用向 ...
- ITK入门教程(11)点集之创建一个点集
目录 1.概述 2.过程 3.代码 4.结果 1.概述 Itk::PointSet 是一种在n 维空间中以点集的形式来表示几何图形的基类.它是为itk::Mesh提供操作点集的必要方法的基类.点具有和 ...
- ITK入门教程(6)ITK图像数据访问与修改(低效版本)
主要内容 1.概述 2.代码展示 3.结果展示 参考目录 1.概述 本节阐述SetPixel( )和GetPixel( )方法的用法.这两个方法可以直接访问图像中包含的像素数据.考虑到这两种方法相对缓 ...
- ITK入门教程(10)ITK从缓冲器中导入图像数据
目录 1.概述 2.过程分析 3.代码样例 4.结果展示 1.概述 这个例子阐述了如何导入数据到itk::Image类中.这在和其它软件系统接口时非常有用.许多系统使用连续的内存块作为图像像素数据的缓 ...
最新文章
- Xampp安装时需注意的事项
- 得到课程《组织行为学》学习笔记07
- spark搭建和使用,处理massive文件
- python线程与进程
- 嵌入式开发环境构建_设计模式:不可变的嵌入式构建器
- 长安渝北工厂机器人_长安UNI-T智能工厂:机器人、激光焊, 一分钟一台车
- 蓝桥杯 ALGO-28 算法训练 星际交流
- android论文前言,安卓论文大纲格式范文 安卓论文提纲怎么写
- MBlock-scartch开发环境搭建
- matlab数字调制蒙特卡洛仿真,AWGN信道下数字通信系统的蒙特卡洛仿真(基于matlab)...
- theano 全连接代码
- 秀米html编辑器,ueditor集成秀米编辑器
- Google analytics如何统计网站信息?
- error redefinition of 'xxx' 问题解决
- ArcGIS删除字段
- matlab中的a逆怎么使用方法,在MATLAB中,求矩阵A逆矩阵可用命令( )。
- 靶机实战(bulldog)
- kubernetes 节点维护 cordon, drain, uncordon
- 小白学Pytorch 系列--Torch API(1)
- [软件渲染器入门]六-应用纹理、背面剔除以及一些WebGL相关