【医学图像处理】超详细!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教育企业与科技企…

清华大学提出全新加速训练大模型方法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; 后来我发现&…

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;字符实体为 &…

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;其实和小张一样的朋友不…

命令查询职责分离 (CQRS)

CQRS 的最初需求 多年来&#xff0c;传统的 CRUD&#xff08;创建、读取、更新、删除&#xff09;模式一直是系统架构的支柱。在 CRUD 中&#xff0c;读取和写入操作通常由相同的数据模型和相同的数据库模式处理。虽然这种方法简单直观&#xff0c;但随着系统规模的扩大和需求…

第99步 深度学习图像目标检测:SSDlite建模

基于WIN10的64位系统演示 一、写在前面 本期&#xff0c;我们继续学习深度学习图像目标检测系列&#xff0c;SSD&#xff08;Single Shot MultiBox Detector&#xff09;模型的后续版本&#xff0c;SSDlite模型。 二、SSDlite简介 SSDLite 是 SSD 模型的一个变种&#xff0c…

竹云参编《公共数据授权运营平台技术要求》团体标准正式发布

2023年11月23日&#xff0c;第二届全球数字贸易博览会“数据要素治理与市场化论坛”于杭州成功召开&#xff0c;国家数据局党组书记、局长刘烈宏&#xff0c;浙江省委常委、常务副省长徐文光出席会议并致辞。会上&#xff0c;国家工业信息安全发展研究中心发布并解读了我国首部…

[Linux] 冯诺依曼体系结构 与 操作系统

文章目录 1、冯诺依曼体系结构2、操作系统 1、冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置&#xff0c;因此程序指令和数据的宽度相…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(下)

文章目录 概述端云调用流程端侧集成AGC SDK端侧省市地区联动的地址选择器组件开发创建省市数据模型创建省市地区视图UI子组件创建页面UI视图Page文件 打包测试总结 概述 我们在前面的课程&#xff0c;对云开发的入门做了介绍&#xff0c;以及使用一个省市地区联动的地址选择器…

三次输错密码后,系统是怎么做到不让我继续尝试的?

1故事背景 忘记密码这件事&#xff0c;相信绝大多数人都遇到过&#xff0c;输一次错一次&#xff0c;错到几次以上&#xff0c;就不允许你继续尝试了。 但当你尝试重置密码&#xff0c;又发现新密码不能和原密码重复&#xff1a; 图片 相信此刻心情只能用一张图形容&#xf…

Mobaxterm 使用lrzsz传输文件(rz/sz)

Mobaxterm 使用lrzsz传输文件报错 1. 现象 最近从xshell切换到Mobaxterm其他一切正常,就是使用rz传输文件时会出现错误,比较苦恼. 会出现以下错误 [rootcentos7 rpmbuild]# rz ▒CCCCCCCCCCC23be50ive.**B0100000023be502. 解决方法 去官网(https://mobaxterm.mobatek.net…

2021年03月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 在《采矿》游戏中,当角色捡到黄金时财富值加1分,捡到钻石时财富值加2分,下面哪个程序实现这个功能? A: B: C: D: 答案:D A将变量值固定,BC为双重判断