如何读取并对nii三维数据进行切片处理、转换格式保存

1.首先,我们从https://ww2.mathworks.cn/matlabcentral/fileexchange/8797-tools-for-nifti-and-analyze-image?s_tid=mwa_osa_a 下载Tools for NIfTI and ANALYZE image,并放到toolbox路径中;

2.添加导入路径:addpath('/MATLAB/R2013a/toolbox/NIfTI_20140122');

3. 导入图像:

close all;

clear all;

clc;

nii = load_nii( 'CT_wl_0.nii' );  % 装载.nii数据

img = nii.img;  % 因为这个文件有img和head二个部分,其中img部分是图像数据

4:切片分层显示图像:

[n1,n2,n3] = size(img); %读取文件的各个维度大小

imshow(img(:,:,10),[]); %预览第10个维度的图片

for i = 1:n3

figure(i) %建立一个图形窗口,如果没有这一句则所有切片只会依次显示于一个窗口

ti = imshow(img(:,:,i),[]);

end

5:保存图像为tif格式或其它格式:

imwrite(img(:,:,1),'result.tif');

>> imwrite(img(:,:,2),'result02.tif');

>> imwrite(img(:,:,3),'result03.tif');

>> imwrite(img(:,:,4),'result04.tif');

>> imwrite(img(:,:,5),'result05.tif');

>> imwrite(img(:,:,6),'result06.tif');

>> imwrite(img(:,:,7),'result07.tif');

>> imwrite(img(:,:,8),'result08.tif');

>> imwrite(img(:,:,9),'result09.tif');

>> imwrite(img(:,:,10),'result10.tif');

>> imwrite(img(:,:,11),'result11.tif');

>> imwrite(img(:,:,12),'result12.tif');

>> imwrite(img(:,:,13),'result13.tif');

>> imwrite(img(:,:,14),'result14.tif');

>> imwrite(img(:,:,15),'result15.tif');

>> imwrite(img(:,:,16),'result16.tif');

>> imwrite(img(:,:,17),'result17.tif');

>> imwrite(img(:,:,18),'result18.tif');

 

注:1.只有imwrite途经保存的图像没有白边

    2.保存到当前文件夹下:imwrite(I,'stripes2.png');

保存到当前文件夹下的一个子文件result下:imwrite(I,'./result/stripes2.png');

保存到当前文件夹上一层的一个文件夹result下:imwrite(I,'../result/stripes2.png');

其中I为要保存图像,stripes2.png为文件名,保存为png格式,要提前建立一个文件夹result才可以。

3.保存多个图像时,顺序命名图像文件名称需用到 num2str 或 sprintf命令。

 

 

针对第三点进行补充,可以自动命名并保存所有切片的程序如下:

nii = load_nii( 'MR_std.nii' );  % 装载.nii数据

img = nii.img;  % 因为这个文件有img和head二个部分,其中img部分是图像数据

save image.mat img  % 将数据变成mat格式

load 'image.mat'  % 加载数据

[n1, n2, n3] = size(img);   % 获取.nii文件的三个维度,一般1、2维是图像维度,第三维是切片

for i = 1:n3   % 开始切片数据轮寻

figure(i)   % 开始显示图片

ti = imshow(img(:,:,i),[]);  % 显示每一张切片图像

title(['result',num2str(i)])

     set(gcf,'color',[1 1 1])

     F(i)=getframe(gcf);

     imwrite(F(i).cdata,['result',num2str(i),'.tif'])   

end

<think>我们面对的任务是:将3DNIfTI图像切片2D图像,然后再将多个2D切片回3D保存为压缩的nii.gz格式。但是,这里有一个关键点:用户最后要求将“处理后的2D切片”合保存nii.gz格式。这意味着用户可能对2D切片做了一些处理(如分析、修改),然后需要重新组合成3D数据。步骤可以分解为:1.读取原始的3DNIfTI文件(.nii或.nii.gz)。2.将3D数据拆分成2D切片(每个切片是3D数据的一个层面)。3.(可选)用户对每个2D切片进行处理(这一步由用户完成,我们只提供接口思路)。4.将处理后的2D切片重新组合成3D数据。5.保存为压缩的.nii.gz格式。我们将使用Python和常用的医学图像处理库,如nibabel(用于读写NIfTI文件)和numpy(用于数组操作)。注意:在重组3D数据时,需要确保切片的顺序和原始数据一致。以下是一个完整的示例代码,包括读取切片、重组和保存的过程。</think> 要将 NIfTI 格式的 3D 医学影像切片转换2D 图像,然后将处理后的 2D 切片重新合保存为压缩的 nii.gz 格式,可以按照以下步骤进行: ### 步骤 1: 读取 3D NIfTI 文件 使用 Python 的 `nibabel` 库读取 nii.gz 文件: ```python import nibabel as nib # 读取 3D NIfTI 文件 img = nib.load('input.nii.gz') data = img.get_fdata() # 获取三维数组 (X, Y, Z) affine = img.affine # 保存仿射变换矩阵 header = img.header # 保存头部信息 ``` ### 步骤 2: 提取 2D 切片 按 Z 轴(第三维度)切片转换2D 图像: ```python import numpy as np # 提取所有轴向切片 (Z方向) slices = [] for z in range(data.shape[2]): slice_2d = data[:, :, z] slices.append(slice_2d) # 在此处添加对切片处理 (如图像增强/分析等) # processed_slice = your_processing_function(slice_2d) ``` ### 步骤 3: 合 2D 切片为 3D 数据处理后的切片重组为 3D 数组: ```python # 创建新3D数组 new_data = np.zeros_like(data) for z in range(len(slices)): new_data[:, :, z] = slices[z] # 使用处理后的切片 # 如果切片顺序改变,需恢复原始方向 # (医学影像通常沿Z轴切片) ``` ### 步骤 4: 保存为压缩 nii.gz 格式 ```python # 创建新的NIfTI图像 new_img = nib.Nifti1Image(new_data, affine, header) # 保存压缩格式 nib.save(new_img, 'output.nii.gz') ``` ### 关键注意事项: 1. **空间方向一致性**: - 必须保留原始文件的仿射矩阵 (`affine`) 和头部信息 (`header`) - 确保切片顺序不变 (通常沿 Z 轴切片) 2. **数据处理**: ```python # 示例:标准化处理 def process_slice(slice): return (slice - np.min(slice)) / (np.max(slice) - np.min(slice)) ``` 3. **格式要求**: - NIfTI 要求 2D 切片尺寸相同 - 使用 `nibabel≥3.2.0` 自动处理压缩 4. **完整性检查**: ```python # 验证重组后数据维度 assert new_data.shape == data.shape ``` ### 完整流程示例: ```python import nibabel as nib import numpy as np # 1. 读取原始数据 img = nib.load('CT_scan.nii.gz') data = img.get_fdata() # 2. 切片处理 processed_slices = [] for z in range(data.shape[2]): slice = data[:, :, z] # 此处添加处理逻辑 ↓ processed = slice * 1.5 # 示例:对比度增强 processed_slices.append(processed) # 3. 重组数据 new_data = np.stack(processed_slices, axis=2) # 4. 保存新文件 new_img = nib.Nifti1Image(new_data, img.affine, img.header) nib.save(new_img, 'processed_CT.nii.gz') ``` > **医学影像处理要点**:处理前后需保持空间坐标一致性,否则会导致解剖结构错位[^1]。推荐使用`ITK-SNAP`验证结果[^1]。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值