当前位置: 首页 > 编程笔记 >

使用SimpleITK读取和保存NIfTI/DICOM文件实例

鄢松
2023-03-14
本文向大家介绍使用SimpleITK读取和保存NIfTI/DICOM文件实例,包括了使用SimpleITK读取和保存NIfTI/DICOM文件实例的使用技巧和注意事项,需要的朋友参考一下

我就废话不多说了,大家还是直接看代码吧~

## using simpleITK to load and save data.
import SimpleITK as sitk
itk_img = sitk.ReadImage('./nifti.nii.gz')
img = sitk.GetArrayFromImage(itk_img)
print("img shape:",img.shape)

## save 
out = sitk.GetImageFromArray(img)
# # out.SetSpacing(itk_img.GetSpacing())
# # out.SetOrigin(itk_img.GetOrigin())
sitk.WriteImage(out,'simpleitk_save.nii.gz')

读取DICOM序列

import sys
import SimpleITK as sitk
import numpy as np

dcm_directory = "./flair_dicom"
series_ids = sitk.ImageSeriesReader.GetGDCMSeriesIDs(dcm_directory)
print("series ids:",series_ids)

if not series_ids:
 print("ERROR: given directory dose not a DICOM series.")
 sys.exit(1)

series_file_names = sitk.ImageSeriesReader.GetGDCMSeriesFileNames(dcm_directory,series_ids[0])
series_reader = sitk.ImageSeriesReader()
series_reader.SetFileNames(series_file_names)
image3D = series_reader.Execute()
size = image3D.GetSize()
print( "Image size:", size[0], size[1], size[2] )

image_array = sitk.GetArrayFromImage(image3D)

# SimpleITK读取的图像数据的坐标顺序为zyx,即从多少张切片到单张切片的宽和高;
# 而据SimpleITK Image获取的origin和spacing的坐标顺序则是xyz

origin = image3D.GetOrigin()
spacing = image3D.GetSpacing()
print("origin:",origin," spacing:",spacing)

读取DICOM单个文件

import SimpleITK as sitk
import numpy as np
image = sitk.ReadImage(slice_path)
image_array = sitk.GetArrayFromImage(image) # z, y, x

补充知识:itk 读取图像,两种格式之间转换

我就废话不多说了,大家还是直接看代码吧~

/*******************************************************
 
	控制台运行程序
	输入:
		程序名称
		读取图像文件名
		保存图像文件名
	输出:
		保存另一种类型的图像
	功能:
		图像在jpeg和bmp两种格式之间互换
********************************************************/
 
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImageIOFactory.h"
#include "itkBMPImageIOFactory.h"
#include "itkJPEGImageIOFactory.h"
#include <iostream>
 
int main(int argc , char *argv[])
{
	if (argc < 3)
	{
		std::cerr << "Usage: " << std::endl;
		std::cerr << argv[0] << " inputImageFile outputImageFile " << std::endl;
		return EXIT_FAILURE;
	}
 
	itk::BMPImageIOFactory::RegisterOneFactory();
	itk::JPEGImageIOFactory::RegisterOneFactory();
 
	typedef itk::Image< unsigned char, 2 > ImageType;
	typedef itk::ImageFileReader< ImageType > ReaderType;
	typedef itk::ImageFileWriter< ImageType > WriterType;
 
	ReaderType::Pointer reader = ReaderType::New();
	WriterType::Pointer writer = WriterType::New();
 
	const char * inputFilename = argv[1];
	const char * outputFilename = argv[2];
 
	reader->SetFileName( inputFilename );
	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;
	}
 
	system("pause");
	return 0;
}

以上这篇使用SimpleITK读取和保存NIfTI/DICOM文件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍python读取和保存视频文件,包括了python读取和保存视频文件的使用技巧和注意事项,需要的朋友参考一下 为了获取视频,应该创建一个 VideoCapture 对象。他的参数可以是设备的索引号,或者是一个视频文件。设备索引号就是在指定要使用的摄像头。 一般的笔记本电脑都有内置摄像头。所以参数就是 0。你可以通过设置成 1 或者其他的来选择别的摄像头。之后,你就可以一帧一帧的捕获视

  • 本文向大家介绍python 读取dicom文件,生成info.txt和raw文件的方法,包括了python 读取dicom文件,生成info.txt和raw文件的方法的使用技巧和注意事项,需要的朋友参考一下 目标:利用python读取dicom文件,并进行处理生成info.txt和raw文件 实现:通过pydicom读取dicom文件 代码: 代码编写过程遇到的问题及解决方法: Problem o

  • 本文向大家介绍Python实现读取并保存文件的类,包括了Python实现读取并保存文件的类的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现读取并保存文件的类。分享给大家供大家参考,具体如下: 这个类写在一个叫class_format.py 的文件里, 放在D盘 有一个testcsv.txt 文件放在D盘,内容如下(oi的两边有空格): 这个代码的ReadData模块用到了c

  • 本文向大家介绍Python vtk读取并显示dicom文件示例,包括了Python vtk读取并显示dicom文件示例的使用技巧和注意事项,需要的朋友参考一下 因为做项目的原因,所以接触到了医学图像dicom文件。vtk刚开始看,这里仅仅只是其最简单的读取显示功能。此处用到了vtk库,可自行百度安装方法。 下面附上代码: 运行程序得到显示图: DICOM图像显示是可以设置窗宽、窗位的,还在学习尝试

  • 本文向大家介绍Android实现文件的保存与读取功能示例,包括了Android实现文件的保存与读取功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android实现文件的保存与读取功能。分享给大家供大家参考,具体如下: 注: 在Activity中有 getFileDir() 和 getCacheDir(); 方法可以获得当前的手机自带的存储空间中的当前包文件的路径 getFileD

  • 问题内容: 我需要找到一种最佳方法,即使用node.js实时读取正在写入文件的数据。麻烦的是,Node是一艘飞速前进的船,这使得很难找到解决问题的最佳方法。 我要做什么我 有一个Java进程正在执行某项操作,然后将其执行的结果写入文本文件。运行通常需要5分钟到5个小时的时间,整个时间都会写入数据,并且可以达到相当高的吞吐率(大约1000行/秒)。 我想实时读取此文件,然后使用节点聚合数据并将其写入