ITK 实现多张图像转成单个nii.gz或mha文件案例


Posted in Python onJuly 01, 2020

主要实现的部分是利用NameGeneratorType读入系列图像,见头文件#include "itkNumericSeriesFileNames.h"。

需要包含的头文件有:

#include "itkImage.h"
#include "itkImageSeriesReader.h"
#include "itkImageFileWriter.h"
#include "itkNumericSeriesFileNames.h"
#include "itkPNGImageIO.h"//转成JPG格式,将PNG替换成JPEG就可以。

int main( int argc, char ** argv )
{
 // 需要四个参数,分别是程序起点,第一张图像的编号和最后一张图像的变化,输出文件的名称(包含路径)
 if( argc < 4 )
 {
 std::cerr << "Usage: " << std::endl;
 std::cerr << argv[0] << " firstSliceValue lastSliceValue outputImageFile " << std::endl;
 return EXIT_FAILURE;
 }
//定义读入图像类型,创建对应的reader
 typedef unsigned char  PixelType;
 const unsigned int Dimension = 3;

 typedef itk::Image< PixelType, Dimension > ImageType;
 
 typedef itk::ImageSeriesReader< ImageType > ReaderType;
 typedef itk::ImageFileWriter< ImageType > WriterType;

 ReaderType::Pointer reader = ReaderType::New();
 WriterType::Pointer writer = WriterType::New();

//输入参数定义
 const unsigned int first = atoi( argv[1] );
 const unsigned int last = atoi( argv[2] );
 const char * outputFilename = argv[3];//输出的文件名加上对应格式的后缀即可,如mha或nii.gz

//系列图像读入
 typedef itk::NumericSeriesFileNames NameGeneratorType;
 NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
 nameGenerator->SetSeriesFormat( "vwe%03d.png" );

 nameGenerator->SetStartIndex( first );
 nameGenerator->SetEndIndex( last );
 nameGenerator->SetIncrementIndex( 1 );//张数的增长间距

//读入图像,写出图像,进行Update
 reader->SetImageIO( itk::PNGImageIO::New() );
 reader->SetFileNames( nameGenerator->GetFileNames() );
 writer->SetFileName( outputFilename );
 writer->SetInput( reader->GetOutput() );

 try
 {
 writer->Update();
 }
 catch( itk::ExceptionObject & err )
 {
 std::cerr << "ExceptionObject caught !" << std::endl;
 std::cerr << err << std::endl;
 return EXIT_FAILURE;
 }

 return EXIT_SUCCESS;
}

补充知识:将一组png图片转为nii.gz

主要之前使用matlab 对numpy数组存放方式不是很了解.应该是[z,x,y]这样在itksnamp上看就对了

import SimpleITK as sitk
import glob
import numpy as np
from PIL import Image
import cv2
 
import matplotlib.pyplot as plt # plt 用于显示图片
def save_array_as_nii_volume(data, filename, reference_name = None):
 """
 save a numpy array as nifty image
 inputs:
 data: a numpy array with shape [Depth, Height, Width]
 filename: the ouput file name
 reference_name: file name of the reference image of which affine and header are used
 outputs: None
 """
 img = sitk.GetImageFromArray(data)
 if(reference_name is not None):
 img_ref = sitk.ReadImage(reference_name)
 img.CopyInformation(img_ref)
 sitk.WriteImage(img, filename)
 
image_path = './oriCvLab/testCvlab/img/'
image_arr = glob.glob(str(image_path) + str("/*"))
image_arr.sort()
 
print(image_arr, len(image_arr))
allImg = []
allImg = np.zeros([165, 768,1024], dtype='uint8')
for i in range(len(image_arr)):
 single_image_name = image_arr[i]
 img_as_img = Image.open(single_image_name)
 # img_as_img.show()
 img_as_np = np.asarray(img_as_img)
 allImg[i, :, :] = img_as_np
 
# np.transpose(allImg,[2,0,1])
save_array_as_nii_volume(allImg, './testImg.nii.gz')
print(np.shape(allImg))
img = allImg[:, :, 55]
# plt.imshow(img, cmap='gray')
# plt.show()

以上这篇ITK 实现多张图像转成单个nii.gz或mha文件案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python snownlp情感分析简易demo(分享)
Jun 04 Python
Python查询IP地址归属完整代码
Jun 21 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
基于python list对象中嵌套元组使用sort时的排序方法
Apr 18 Python
python使用celery实现异步任务执行的例子
Aug 28 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
Python hashlib常见摘要算法详解
Jan 13 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
Oct 14 Python
python代码实现图书管理系统
Nov 30 Python
Python 装饰器(decorator)常用的创建方式及解析
Apr 24 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
Jul 01 #Python
读取nii或nii.gz文件中的信息即输出图像操作
Jul 01 #Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
Jul 01 #Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 #Python
python 读取.nii格式图像实例
Jul 01 #Python
使用npy转image图像并保存的实例
Jul 01 #Python
python实现npy格式文件转换为txt文件操作
Jul 01 #Python
You might like
php修改文件上传限制方法汇总
2015/04/07 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
2016/05/27 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
JS面向对象编程——ES6 中class的继承用法详解
2020/03/03 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
gearman的安装启动及python API使用实例
2014/07/08 Python
Python决策树分类算法学习
2017/12/22 Python
Python实现求数列和的方法示例
2018/01/12 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
pytorch1.0中torch.nn.Conv2d用法详解
2020/01/10 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
小学生期末自我鉴定
2014/01/19 职场文书
上班打牌检讨书
2014/02/07 职场文书
企业安全生产责任书
2014/04/14 职场文书
市场开发计划书
2014/05/07 职场文书
安全横幅标语
2014/06/09 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
答谢词范文
2015/01/05 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
Golang 结构体数据集合
2022/04/22 Golang