【醫學圖像處理】超詳細!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.pswp.cn/news/166213.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166213.shtml
英文地址,請注明出處:http://en.pswp.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;其實和小張一樣的朋友不…