【医学图像处理】超详细!PET图像批量预处理

目录

  • 一、单个PET图像预处理
    • 1、使用[MRIConvert](https://pan.baidu.com/s/1cn3kgeVRir8HvP6HHm0M0Q?pwd=5rt5)处理DCM
    • 2、MRI和PET数据预处理过程
      • 1) 打开matlab命令行输入spm pet,打开SMP12,界面如下
      • 2) Realign,只需要编辑Session,其他参数不用改,编辑好后点击左上角绿色三角形按钮:
      • 3)将mean002_s_0729的hdr数据配到PET模板上,点击Normalise(Est & Wri)
      • 4)将wmeanxxxx.hdr配准到自己的MRI图像wmxxxx.nii上,打开Coregister(Est & Res),只修改Reference Image和Source Image;
      • 5)去头颅
      • 6)最后一步进行8mm的平滑
  • 二、批量预处理
    • 1、点击Batch
    • 2、转到工作路径
    • 3、选择预处理步骤
    • 4、生成batch脚本
    • 5、修改脚本代码

最近在做PET图像的预处理,相对于SMRI,PET的预处理要更加复杂,PET的预处理需要一步一步进行,每一步都需要前一步的输出结果,因此在批量预处理上也很麻烦。不过在和实验室小伙伴的共同努力下最终是完成了PET批量预处理。
自己在网上搜索教程的时候也没有找到很符合自己需要的教程,因此,把该问题的解决方法记录下来,供大家一起参考,如果觉得有用的话麻烦点个赞谢谢。

注:本方法使用的数据是从ADNI上下载的18F-FDG图像,下载的格式是DCM格式(PET图像会有其他格式的图像,我只使用了DCM格式的图像)环境使用了MATLABR2021a SPM12

一、单个PET图像预处理

为了更好理解批量预处理,有必要了解单个PET图像是如何预处理的。只想看批量预处理的直接跳到批量预处理即可
PET预处理整个流程如下:使用MRIConvert软件将DCM格式转为hdr格式→Realign→Normalise→Coregister→ImCalc→Smooth

1、使用MRIConvert处理DCM

打开程序选择输出输入目录并且选择SPM Analyze如下图所示
在这里插入图片描述
转换完成后输出如下:

这里生成了多个hdr/img的图像,只需要选择其中最好的一个即可(我看起来都是一样的)

在这里插入图片描述
使用MRIcron打开hdr文件如下:MRIcron在我的之前的文章有介绍
在这里插入图片描述

2、MRI和PET数据预处理过程

1) 打开matlab命令行输入spm pet,打开SMP12,界面如下

在这里插入图片描述

2) Realign,只需要编辑Session,其他参数不用改,编辑好后点击左上角绿色三角形按钮:

在这里插入图片描述
在这里插入图片描述
此时在输出目录下生成如下文件:
在这里插入图片描述

3)将mean002_s_0729的hdr数据配到PET模板上,点击Normalise(Est & Wri)

在这里插入图片描述
弹出以下窗口,只需编辑Source Image, Images to Write和Template Image;其他参数不动,最后点击左上角蓝色三角形运行
在这里插入图片描述
生成如下文件:
在这里插入图片描述
点开wmeanxxxx.hdr如下:
在这里插入图片描述

4)将wmeanxxxx.hdr配准到自己的MRI图像wmxxxx.nii上,打开Coregister(Est & Res),只修改Reference Image和Source Image;

注意:如果只需要处理PET图像,MRI可以使用模板来进行配准和去头骨影像(这里是配准到同一患者的SMRI预处理后的图像 wmxxxx.nii是SMRI预处理后的图像)
在这里插入图片描述
在这里插入图片描述
生成如下文件:
在这里插入图片描述
此时的PET与MRI大小相同
在这里插入图片描述

5)去头颅

点击ImCalc
在这里插入图片描述
弹出如下界面,Input Images先选择MRI的图像,即wmxxxx.nii(也可以选MRI模板),再选rwmeanxxxx.img,Expression输入i2.*(i1>0.05),其中i1表示第一张图像,i2表示第二张,运行后会在matlab的当前路径输出结果,我这里是PETprocess\processing,所以在下面会生成output图像。
在这里插入图片描述
在这里插入图片描述
打开output图像如下:
在这里插入图片描述

6)最后一步进行8mm的平滑

在这里插入图片描述
在这里插入图片描述
最后得到的图像如下:
在这里插入图片描述
这便是PET预处理后的图像,到此整个PET预处理流程已经走完,做完后发现这也太复杂了,如果要处理几百张图像人估计都没了。。。所以接下来的才是重头戏,批量预处理。

二、批量预处理

我这里的方法是使用SPM12自带的batch工具选择需要的步骤之后生成脚本文件,然后根据实际情况修改脚本完成批量预处理!

1、点击Batch

在这里插入图片描述

2、转到工作路径

在这里插入图片描述
在这里插入图片描述

3、选择预处理步骤

在这里插入图片描述
选择后要点一下要输入数据的地方不然可能会报错,如下图双击Data然后回多出一行Session这样就不会有问题了
在这里插入图片描述
依次选择所有步骤如下一共5个步骤:
在这里插入图片描述
注意在Image Calculator的Expression输入是固定的因此可以直接在这里输入如下:

在这里插入图片描述

4、生成batch脚本

在这里插入图片描述
选择保存脚本的路径
在这里插入图片描述
点击保存后,会生成两个.m文件并且自动在matlab打开脚本文件如下:
在这里插入图片描述
在这里插入图片描述
这里生成的只是模板文件,图像的输入输出还有一些细节是需要我们手动修改实现的。

5、修改脚本代码

1、xxx.m文件代码如下(xxx是你自己的命名)

% List of open inputs
% Realign: Estimate & Reslice: Session - cfg_files
% Normalise: Estimate & Write: Image to Align - cfg_files
% Normalise: Estimate & Write: Images to Write - cfg_files
% Coregister: Estimate & Reslice: Reference Image - cfg_files
% Coregister: Estimate & Reslice: Source Image - cfg_files
% Image Calculator: Input Images - cfg_files
% Smooth: Images to smooth - cfg_files% 设置MRI文件夹路径
mri_folder = 'E:\ADNI\PETprocess\processing\batch\SMRI';% 设置PET文件夹路径和待处理的图像数量
pet_folder = 'E:\ADNI\PETprocess\processing\batch\PET';
% 读取PET文件夹中的图像文件名列表
pet_files = dir(fullfile(pet_folder, '*.img'));
numFiles = length(pet_files);
pet_filenames = {pet_files.name};
nrun = numFiles; % 请将X替换为实际的图像数量
jobfile = {'E:\ADNI\PETprocess\processing\xxx_job.m'}; %注意这里要对应
jobs = repmat(jobfile, 1, nrun);% 循环处理每个PET图像
for crun = 1:nrunoutput_path = 'E:\ADNI\PETprocess\processing\batch\output\AD'; % 数据结果的目录,job文件也要添加这个路径subjectID = strrep(pet_filenames{crun}, '.img', ''); % 获取当前处理的图像文件名(不含扩展名)% Realign: Estimate & Resliceinputs{1, crun} = cellstr(fullfile(pet_folder, pet_filenames{crun})); % 输入待处理的PET图像% Normalise: Estimate & Writeinputs{2, crun} = cellstr(fullfile(pet_folder, ['mean', subjectID, '.img'])); % 输入mean图像inputs{3, crun} = cellstr(fullfile(pet_folder, ['mean', subjectID, '.img'])); % 输入mean图像% Coregister: Estimate & Resliceinputs{4, crun} = cellstr(fullfile(mri_folder, [subjectID, '.nii'])); % MRI参考图像inputs{5, crun} = cellstr(fullfile(pet_folder, ['wmean', subjectID, '.img'])); % 输入rwmean图像% Image Calculatori1 = fullfile(mri_folder, [subjectID, '.nii']);i2 = fullfile(pet_folder, ['rwmean' subjectID, '.img']);inputs{6, crun} = [cellstr(i1); cellstr(i2)]; % 将i1和i2组合成一个cell数组,然后赋值给inputs{6, crun}inputs{7, crun} = [subjectID, '.nii'];% Smoothinputs{8, crun} = cellstr(fullfile(output_path, [subjectID, '.nii']));  % 输入文件为subjectID.nii图像
end
% 加载SPM默认设置和运行处理任务
spm('defaults', 'PET');
spm_jobman('run', jobs, inputs{:});

2、xxx_job.m文件代码如下(xxx是你自己的命名)

%-----------------------------------------------------------------------
% Job saved on 20-Nov-2023 19:01:02 by cfg_util (rev $Rev: 7345 $)
% spm SPM - SPM12 (7771)
% cfg_basicio BasicIO - Unknown
%-----------------------------------------------------------------------
matlabbatch{1}.cfg_basicio.file_dir.dir_ops.cfg_cd.dir = {'D:\matlabR2021a\matlabR2021a\bin'};
matlabbatch{2}.spm.spatial.realign.estwrite.data = {'<UNDEFINED>'};
matlabbatch{2}.spm.spatial.realign.estwrite.eoptions.quality = 0.9;
matlabbatch{2}.spm.spatial.realign.estwrite.eoptions.sep = 4;
matlabbatch{2}.spm.spatial.realign.estwrite.eoptions.fwhm = 5;
matlabbatch{2}.spm.spatial.realign.estwrite.eoptions.rtm = 1;
matlabbatch{2}.spm.spatial.realign.estwrite.eoptions.interp = 2;
matlabbatch{2}.spm.spatial.realign.estwrite.eoptions.wrap = [0 0 0];
matlabbatch{2}.spm.spatial.realign.estwrite.eoptions.weight = '';
matlabbatch{2}.spm.spatial.realign.estwrite.roptions.which = [2 1];
matlabbatch{2}.spm.spatial.realign.estwrite.roptions.interp = 4;
matlabbatch{2}.spm.spatial.realign.estwrite.roptions.wrap = [0 0 0];
matlabbatch{2}.spm.spatial.realign.estwrite.roptions.mask = 1;
matlabbatch{2}.spm.spatial.realign.estwrite.roptions.prefix = 'r';
matlabbatch{3}.spm.spatial.normalise.estwrite.subj.vol = '<UNDEFINED>';
matlabbatch{3}.spm.spatial.normalise.estwrite.subj.resample = '<UNDEFINED>';
matlabbatch{3}.spm.spatial.normalise.estwrite.eoptions.biasreg = 0.0001;
matlabbatch{3}.spm.spatial.normalise.estwrite.eoptions.biasfwhm = 60;
matlabbatch{3}.spm.spatial.normalise.estwrite.eoptions.tpm = {'D:\matlabR2021a\matlabR2021a\toolbox\spm12\spm12\tpm\TPM.nii'};
matlabbatch{3}.spm.spatial.normalise.estwrite.eoptions.affreg = 'mni';
matlabbatch{3}.spm.spatial.normalise.estwrite.eoptions.reg = [0 0.001 0.5 0.05 0.2];
matlabbatch{3}.spm.spatial.normalise.estwrite.eoptions.fwhm = 0;
matlabbatch{3}.spm.spatial.normalise.estwrite.eoptions.samp = 3;
matlabbatch{3}.spm.spatial.normalise.estwrite.woptions.bb = [-78 -112 -7078 76 85];
matlabbatch{3}.spm.spatial.normalise.estwrite.woptions.vox = [2 2 2];
matlabbatch{3}.spm.spatial.normalise.estwrite.woptions.interp = 4;
matlabbatch{3}.spm.spatial.normalise.estwrite.woptions.prefix = 'w';
matlabbatch{4}.spm.spatial.coreg.estwrite.ref = '<UNDEFINED>';
matlabbatch{4}.spm.spatial.coreg.estwrite.source = '<UNDEFINED>';
matlabbatch{4}.spm.spatial.coreg.estwrite.other = {''};
matlabbatch{4}.spm.spatial.coreg.estwrite.eoptions.cost_fun = 'nmi';
matlabbatch{4}.spm.spatial.coreg.estwrite.eoptions.sep = [4 2];
matlabbatch{4}.spm.spatial.coreg.estwrite.eoptions.tol = [0.02 0.02 0.02 0.001 0.001 0.001 0.01 0.01 0.01 0.001 0.001 0.001];
matlabbatch{4}.spm.spatial.coreg.estwrite.eoptions.fwhm = [7 7];
matlabbatch{4}.spm.spatial.coreg.estwrite.roptions.interp = 4;
matlabbatch{4}.spm.spatial.coreg.estwrite.roptions.wrap = [0 0 0];
matlabbatch{4}.spm.spatial.coreg.estwrite.roptions.mask = 0;
matlabbatch{4}.spm.spatial.coreg.estwrite.roptions.prefix = 'r';
matlabbatch{5}.spm.util.imcalc.input = '<UNDEFINED>';
matlabbatch{5}.spm.util.imcalc.output = '<UNDEFINED>'; %这里要改
matlabbatch{5}.spm.util.imcalc.outdir = {'E:\ADNI\PETprocess\processing\batch\output\AD'}; %改成你自己的目录
matlabbatch{5}.spm.util.imcalc.expression = 'i2.*(i1>0.05)';
matlabbatch{5}.spm.util.imcalc.var = struct('name', {}, 'value', {});
matlabbatch{5}.spm.util.imcalc.options.dmtx = 0;
matlabbatch{5}.spm.util.imcalc.options.mask = 0;
matlabbatch{5}.spm.util.imcalc.options.interp = 1;
matlabbatch{5}.spm.util.imcalc.options.dtype = 4;
matlabbatch{6}.spm.spatial.smooth.data = '<UNDEFINED>';
matlabbatch{6}.spm.spatial.smooth.fwhm = [8 8 8];
matlabbatch{6}.spm.spatial.smooth.dtype = 0;
matlabbatch{6}.spm.spatial.smooth.im = 0;
matlabbatch{6}.spm.spatial.smooth.prefix = 's';

修完成后运行xxx.m即可

注:job.m大部分代码是自动生成的,如果你完全按照我的步骤运行代码后报错如下:
在这里插入图片描述
这大概率是job文件的错误,请仔细对照job文件是不是该有<UNDEFINED>地方没有<UNDEFINED>,上面步骤说要点击一下输入文件的地方就是为了防止这里不生成<UNDEFINED>。

OVER(点赞)!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】插值表达式

作用&#xff1a;利用表达式进行插值渲染 语法&#xff1a;{ { 表达式 } } 目录 案例一&#xff1a; 案例二&#xff1a; 案例三&#xff1a; ​编辑 注意&#xff1a; 案例一&#xff1a; <!DOCTYPE html> <html lang"en"> <head><me…

项目中如何配置数据可视化展现

在现今数据驱动的时代&#xff0c;可视化已逐渐成为数据分析的主要途径&#xff0c;可视化大屏的广泛使用便应运而生。很多公司及政务机构&#xff0c;常利用大屏的手段展现其实力或演示业务&#xff0c;可视化的效果能让观者更快速的理解结果并直观的看到数据展现。因此&#…

加速软件开发:自动化测试在持续集成中的重要作用!

持续集成的自动化测试 如今互联网软件的开发、测试和发布&#xff0c;已经形成了一套非常标准的流程&#xff0c;最重要的组成部分就是持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff0c;目前主要的持续集成系统是Jenkins&#xff09;。 那么什么是持…

教育+AIGC开局之年:教育派作业帮、科技派科大讯飞同路不同道

配图来自Canva可画 与往年相比&#xff0c;今年的双11显得格外冷清&#xff0c;GMV&#xff08;商品交易总额&#xff09;数据和增长数据无人提及&#xff0c;京东、淘宝天猫、抖音、快手等平台的火药味都淡了。一片祥和有序的双11氛围中&#xff0c;昔日的K12教育企业与科技企…

sqlserver写入中文乱码问题

sqlserver写入中文乱码问题解决方案 首先查看sqlserver数据库编码 首先查看sqlserver数据库编码 查询语句&#xff1a;SELECT COLLATIONPROPERTY(Chinese_PRC_Stroke_CI_AI_KS_WS, CodePage)&#xff1b; 对应的编码&#xff1a; 936 简体中文GBK 950 繁体中文BIG5 437 美国/加…

算法的10大排序

10大排序算法--python 一颗星--选择排序一颗星--冒泡排序一颗星--插入排序两颗星--归并排序&#xff08;递归-难&#xff09;三颗星--桶排序三颗星--计数排序四颗星--基数排序四颗星--快速排序&#xff0c;寻找标志位&#xff08;递归-难&#xff09;四颗星--又是比较难的希尔排…

Python工具箱系列(四十六)

PDF&#xff08;Portable Document Format&#xff09;是一种便携文档格式&#xff0c;它基于PostScripty这种脚本语言。 ​​ PDF文档操作 PDF&#xff08;Portable Document Format&#xff09;是一种便携文档格式&#xff0c;它基于PostScripty这种脚本语言&#xff0c;它…

清华大学提出全新加速训练大模型方法SoT

近日&#xff0c;微软研究和清华大学的研究人员共同提出了一种名为“Skeleton-of-Thought&#xff08;SoT&#xff09;”的全新人工智能方法&#xff0c;旨在解决大型语言模型(LLMs)生成速度较慢的问题。 尽管像GPT-4和LLaMA等LLMs在技术领域产生了深远影响&#xff0c;但其处…

提供电商数据|带你简单认识天猫API接口相关参数文档调用说明

什么是API接口 API接口(Application Programming Interface Interface)是应用程序与开发人员或其他程序互相通信的方式。它允许开发者访问应用程序的数据和功能。 API接口,软件的“握手”与“交流”之道,软件世界的“好基友”。想让软件聊得来?想开发App却无从下手?API来相救…

【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB为非结构化数据查询插上飞翔的翅膀——以企业知识库为例

前言 以前我曾疑惑&#xff0c;对于非结构化的内容&#xff0c;如一张图片或一段视频&#xff0c;如何实现搜索呢&#xff1f;图片或视频作为二进制文件&#xff0c;我们如何将其转化为可搜索的数据并存储起来&#xff0c;然后在搜索时将其还原呢&#xff1f; 后来我发现&…

5个高防CDN的特点

1. 支持泛解析自定义HTTPS/SSL隐藏源IP。 2. 支持缓存加速永久在线SEO优化。当网站原服务器宕机时&#xff0c;如果开启了此功能&#xff0c;用户仍然可以访问网站&#xff08;用户看到的是 缓存数据&#xff09;&#xff0c;从而达到了网站永不中断服务的效果&#xff0c;可以…

Minio8版本冲突问题

今天在配置minio的时候遇到了一个报错 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2023-11-24 10:31:42.897 ERROR 14312 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *******************…

blk_mq_init_queue函数学习记录

blk-mq编程&#xff0c;主要要调用两个函数进行初始化工作&#xff0c;blk_mq_init_queue这是第二个。该函数先是申请了struct request_queue结构&#xff0c;这个请求队列后面用于赋值给磁盘那个结构体的相应成员。 struct request_queue *blk_mq_init_queue(struct blk_mq_t…

python3到文件的读取以及输出

excel表格的读取和输入输出 python中txt的读取和输入输出 txt输出报错&#x1f447; UnicodeEncodeError: ascii codec cant encode characters in position 154-157: ordinal not in range(128)解决方法

Tomcat 配置

1&#xff1a; 打开 2&#xff1a;选择版本号&#xff0c;我这边是 1.7 3&#xff1a;添加 web 4: 添加jar包 5&#xff1a;添加 6&#xff1a;添加 Tomcat

【每日一题】1410. HTML实体解析器-2023.11.23

题目&#xff1a; 1410. HTML 实体解析器 「HTML 实体解析器」 是一种特殊的解析器&#xff0c;它将 HTML 代码作为输入&#xff0c;并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们对应的字符实体包括&#xff1a; 双引号&#xff1a;字符实体为 &…

vim翻页快捷键

Vim翻页 整页 Ctrlf向下翻页&#xff0c;下一页&#xff0c;相当于Page DownCtrlb向上翻页&#xff0c;上一页&#xff0c;相当于Page Up 半页 Ctrld向下半页&#xff0c;下一半页&#xff0c;光标下移Ctrlu向上半页&#xff0c;上衣半页&#xff0c;光标上移 按行 Ctrle…

vue2【组件的构成】

目录 1&#xff1a;什么是组件化开发 2&#xff1a;vue中的组件化开发 3&#xff1a;vue组件的三个组成部分 4&#xff1a;组件中定义方法&#xff0c;监听器&#xff0c;过滤器&#xff0c;计算属性节点。 5&#xff1a;template中只允许唯一根节点&#xff0c;style默认…

OpenMLDB SQL 开发调试神器 - OpenMLDB SQL Emulator

今天为大家介绍一款来自 OpenMLDB 社区的优秀独立工具 - OpenMLDB SQL Simulator&#xff08;https://github.com/vagetablechicken/OpenMLDBSQLEmulator&#xff09; &#xff0c;可以让你更加高效方便的开发、调试 OpenMLDB SQL。 为了高效的实现时序特征计算&#xff0c;Op…

高质量短效SOCKS5代理IP是什么意思?作为技术你了解吗

小张是一位网络安全技术测试员&#xff0c;最近他接到了一个头疼的任务&#xff0c;那就是评估公司系统的安全性&#xff0c;因此他前来咨询&#xff0c;在得知SOCKS5代理IP可以帮他之后&#xff0c;他不禁产生疑问&#xff0c;这是什么原理&#xff1f;其实和小张一样的朋友不…