使用Voxelmorph配准IXI:数据预处理之颅骨去除及仿射对齐

本文详细介绍如何使用Freesurfer进行颅骨去除和仿射对齐,包括软件下载、安装、环境配置及Python批处理代码。适用于初学者,涵盖多线程加速处理和后期裁剪、归一化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是在原链接https://blog.youkuaiyun.com/qq_38302885/article/details/94045126
的基础上,增加的一些补充,对新入门的同学可能有一些启发。

更新日志

2020.8.25更新:

  • 完善freesurfer的下载链接和教程
  • freesurfer处理代码recon-all后面增加-parallel,可以使用多线程(感谢评论区mamemory同学指出)
  • 增加预处理后裁剪的代码

Freesurfer安装:

1、下载
https://surfer.nmr.mgh.harvard.edu/fswiki/rel7downloads
在这里插入图片描述

2、Licence:
前往官方注册网站进行注册,正确填写邮箱地址,其他信息随意,后面将会收到一封含有附件license.txt的电子邮件,下载下来,放到freesurfer文件夹下面。
http://surfer.nmr.mgh.harvard.edu/registration.html

3、安装
官方安装教程:
https://surfer.nmr.mgh.harvard.edu/fswiki//FS7_linux
中文教程请参考:
https://blog.youkuaiyun.com/uinglin/article/details/79541063

4、安装tcsh

sudo apt-get install tcsh

完成后输入tcsh,不报错的话就没问题了。

使用Freesurfer进行头骨去除和仿射对齐

下面介绍安装好freesurfer后,利用python批处理整个IXI-T1文件夹下所有nii文件的颅骨去除和仿射对齐操作。

测试平台为Ubuntu 16.04,python 3.7,理论上在其他linux环境也能用。

import os
import glob
#请将该路径更改为IXI-T1的原始文件路径
path = r"/run/media/feng/98B216BDB216A034/datasets/IXI-T1/"
# 读取目录下的nii.gz文件
images = glob.glob('/run/media/feng/98B216BDB216A034/datasets/IXI-T1/*.gz*')
# 下面为freesurfer的环境配置命令
a = "export FREESURFER_HOME=/home/feng/freesurfer;"
b = "source $FREESURFER_HOME/SetUpFreeSurfer.sh;"
# 数据所在的目录
c = "export SUBJECTS_DIR=/run/media/feng/98B216BDB216A034/datasets/IXI-T1;"

for image in images:
    # 将文件路径和文件名分离
    (filepath, tempfilename) = os.path.split(image)
    (filename, extension) = os.path.splitext(tempfilename)
    # freesurfer环境配置、颅骨去除、未仿射对齐mpz转nii、仿射对齐、仿射对齐mpz转nii.gz格式
    cmd = a + b + c \  #根据评论有同学反映,recon-all后面增加parallel使用多线程
          + "recon-all -parallel -i " + image + " -autorecon1 -subjid " + filename[:-4] + "&&" \
          + "mri_convert /" + path + filename[:-4] + "/mri/brainmask.mgz /" + path + filename[:-4] \
          + "/mri/brainmask.nii.gz;"\
          + "mri_convert /" + path + filename[:-4] + "/mri/brainmask.mgz --apply_transform /" + path + filename[:-4] \
          + "/mri/transforms/talairach.xfm -o /" + path + filename[:-4] + "/mri/brainmask_affine.mgz&&" \
          + "mri_convert /" + path + filename[:-4] + "/mri/brainmask_affine.mgz /" + path + filename[:-4] \
          + "/mri/brainmask_affine.nii.gz;"
    os.system(cmd)

cmd部分代码说明:

  • 第一条"recon-all -parallel -i " + image + " -autorecon1 -subjid " + filename[:-4]是颅骨去除的命令;
  • 第二条"mri_convert /" + path + filename[:-4] + "/mri/brainmask.mgz /" + path + filename[:-4] + "/mri/brainmask.nii.gz;"是格式转换,为了方便查看,将未进行仿射对齐的图像,从mgz转到nii.gz;
  • 第三条 "mri_convert /" + path + filename[:-4] + "/mri/brainmask.mgz --apply_transform /" + path + filename[:-4] + "/mri/transforms/talairach.xfm -o /" + path + filename[:-4] + "/mri/brainmask_affine.mgz"进行仿射对齐 --apply_transform参数是关键。
  • 第四条 "mri_convert " + path + filename[:-4] + "/mri/brainmask_affine.mgz /" + path + filename[:-4] + "/mri/brainmask_affine.nii.gz;"转格式,将仿射对齐后的mgz转为nii.gz。

整个颅骨去除的过程较慢,根据评论有同学反映,recon-all后面增加-parallel,可以使用多线程加快处理速度。单线程全部转完可能要几天的时间。

请参考http://132.183.240.105/fswiki/ReleaseNotes
请在该网页查找 -parallel 以查看相关内容。

处理后的文件如下所示,其中brainmask.nii.gz是去除头骨后的图像,brainmask_affine.nii.gz是去除头骨且仿射对齐后的图像。
在这里插入图片描述

裁剪和归一化

import glob
import os
import nibabel as nib

#找出IXI-affine下面的所有含有-T1结尾的文件夹路径,请修改该路径
images = sorted(glob.glob('/media/sky/D/DataSet/IXI-affine/*-T1*'))

for image in images:
    #再在该路径下找到子文件夹./mri/ 下含nii.gz的文件
    pic = sorted(glob.glob(image + "/mri/*_affine.nii.gz*"))
    #用nib读入nii文件
    vol = nib.load(pic[0]).get_data()
    #归一化
    vol = vol / 255
    #裁剪成160 x 192 x 224
    vol = vol[48:-48, 31:-33, 3:-29]
    #生成nii文件并保存
    newvol = nib.Nifti1Image(vol, affine=None)
    print(newvol.shape)
    print(image.split('/')[-1] + '.nii.gz')
    nib.save(newvol, '/media/sky/D/DataSet/train/' + image.split('/')[-1] + '.nii.gz')

图片查看

nii.gz文件查看可以使用ITK-SNAP

在这里插入图片描述

欢迎交流。

<think>好的,我现在要解决用户关于IXI数据集分割方法或代码实现的问题。首先,我需要回忆用户提供的引用内容,特别是引用[2]中提到的IXI数据集的相关信息。用户提到IXI数据集包含健康受试者的T1和T2加权图像,并且已经进行了处理。不过用户现在需要的是分割方法或代码,而引用中并没有直接提到分割,所以可能需要结合常见的医学图像分割方法。 接下来,我需要确定IXI数据集通常用于哪些分割任务。通常,脑部MRI数据集如IXI常用于脑区分割、组织分割(如灰质、白质、脑脊液)或病变分割。但根据引用内容,IXI数据集中的受试者是健康的,所以可能没有病变数据,因此分割任务可能集中在脑组织或脑区。 然后,我需要考虑常见的分割方法。传统方法可能包括基于图谱的分割,如使用FSL中的FIRST或FAST工具,而深度学习方法可能使用U-Net、nnUNet等模型。用户可能需要具体的代码示例,比如使用Python库如ANTsPy、NiBabel进行数据处理,或者使用深度学习框架如PyTorch或TensorFlow实现分割模型。 另外,用户提到的数据预处理步骤,如和归一化,在分割前也是必要的,可能需要引用中的FSL-Flirt进行,但用户现在关注的是分割部分。需要确保回答的结构清晰,分步骤说明方法,并提供代码示例。 需要验证是否有公开可用的IXI数据集分割代码,例如在GitHub上是否有相关项目,或者研究论文中提到的实现。如果没有具体代码,可能需要给出通用的分割流程和示例代码,比如使用U-Net进行脑组织分割。 同时,用户可能对数据备步骤感兴趣,比如如何加载IXI数据预处理步骤,以及如何划分数据集进行训练。需要确保代码示例正确,并解释关键步骤,如数据加载、模型定义、训练循环等。 最后,生成相关问题,帮助用户进一步探索,如工具比较、深度学习模型选择、评估指标等。确保回答真实可靠,参考已有的常见法,并在必要时提及引用中的预处理步骤,如对分割的影响。</think>关于IXI数据集的分割实现,医学影像分割通常包含以下核心步骤和实现方法: ### 一、IXI数据集分割典型流程 1. **数据预处理** - 使用$FSL$或$ANTs$进行脑组织提取(BET):$$ \text{BET\_command} = \text{"bet input\_image output\_image -f 0.4 -g 0"} $$ - 空间标化(引用中提到的FSL-Flirt)[^1] - 强度归一化:$I_{norm} = \frac{I - \mu}{\sigma}$ 2. **分割方法实现** **基于深度学习的方法**推荐使用以下框架: ```python import torch.nn as nn import nibabel as nib # U-Net基础结构 class UNet(nn.Module): def __init__(self, in_ch=1, out_ch=3): super().__init__() self.down1 = nn.Sequential(nn.Conv3d(in_ch,64,3), nn.ReLU()) # ... 完整U型结构定义 # 数据加载示例 def load_ixi_data(path): img = nib.load(path).get_fdata() return img.astype(np.float32) ``` 3. **后处理** - 形态学操作消除离散噪声:$$ \text{closing}(I) = (I \oplus B) \ominus B $$ - 连通域分析保留最大区域 ### 二、关键代码实现环节 1. **数据备** ```python from torch.utils.data import Dataset class IXIDataset(Dataset): def __init__(self, img_dir, mask_dir): self.img_paths = sorted(glob(f"{img_dir}/*_t1.nii.gz")) self.mask_paths = sorted(glob(f"{mask_dir}/*_seg.nii.gz")) def __getitem__(self, idx): return load_normalize(self.img_paths[idx]), load_mask(self.mask_paths[idx]) ``` 2. **训练置** ```python model = UNet(in_ch=1, out_ch=3) loss_fn = nn.DiceLoss() optimizer = torch.optim.Adam(model.parameters(), lr=1e-4) ``` ### 三、推荐工具链 1. **传统方法**:FSL-FAST (组织分割) 2. **深度学习方法**:nnUNet框架 3. **可视化工具**:ITK-SNAP
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值