Python——劃分Nifti對應(yīng)模態(tài)數(shù)據(jù)并整理
問題:把DICOM的數(shù)據(jù)用MRIcron的dcm2niigui.exe轉(zhuǎn)好格式以后每個(gè)被試的全部模態(tài)都在一個(gè)文件夾內(nèi),but,有人給了你一個(gè)名單,只要那些人的某幾個(gè)模態(tài)的數(shù)據(jù),比如T1像和DTI,所以該怎么辦?
人數(shù)少時(shí)一個(gè)一個(gè)操作很方便,但數(shù)量大了就發(fā)現(xiàn)代碼的方便之處,而Python正是處理這些任務(wù)明智的選擇。
So,let‘s begin
- 最初想法是在當(dāng)前的文件夾中處理,但是考慮到還要刪除其余不需要的文件,不如以最簡單的方式,就是建立一個(gè)新的文件夾來存放這些結(jié)果數(shù)據(jù)。
比如我這里zhongxin和zhongxin_done就分別是當(dāng)前的文件夾和新建的要存放分好類數(shù)據(jù)的文件夾。

看下未整理之前的轉(zhuǎn)完格式后的文件夾里的數(shù)據(jù)形式:

代碼如下(以后可以迭代):
#coding=utf-8
#20190107 Nifti分類及拷貝
import sys
import os
import shutil
root_dir = u"F:\\zhongxin"
son_dir = os.listdir(root_dir)
new_dir = u'F:\\zhongxin_done'
# print(son_dir)
for son in son_dir:
# 思路是把需要的T1和DTI復(fù)制到新的文件夾中,因此先建立對應(yīng)的文件夾
os.makedirs(u'F:\\zhongxin_done' + u'\\' + son)
new_son_dir = os.path.join(new_dir,son)
# 在每個(gè)人的文件夾內(nèi)建立T1和DTI子文件夾存放其對應(yīng)模態(tài)的數(shù)據(jù)
os.makedirs(new_son_dir + u'\\' + 't1')
os.makedirs(new_son_dir + u'\\' + 'dti')
# 查找對應(yīng)模態(tài)的文件
grand_son_path = root_dir + u'\\'+ son
# 此處會列出當(dāng)前文件夾下全部的一級文件和子文件夾名稱
grand_son_dir = os.listdir(grand_son_path)
# print(grand_son_dir)
# 選取對應(yīng)的模態(tài)并進(jìn)行拷貝
for name in grand_son_dir:
oldfile= root_dir + u'\\' + son + u'\\' + name
newfile_dir = new_son_dir
# 根據(jù)文件的命名特征分類Nifti,比如這里't1mprsag'就是T1像
if 't1mprsag' in name:
shutil.copy(oldfile,newfile_dir + u'\\' + 't1')
if 'ep2ddiffDTI' in name:
shutil.copy(oldfile,newfile_dir + u'\\' + 'dti')
結(jié)果如下:

每個(gè)被試的文件夾下都有兩個(gè)文件夾存放對應(yīng)模態(tài),success。
但這就完了嗎?
Absolutely not!Why?
因?yàn)橐话阆襁@樣命名有規(guī)則的文件雖然很容易處理,但并非總是如此,總有一種混亂令你感動,比如像下面這樣轉(zhuǎn)完格式以后毫無頭緒的文件類型:

這樣就沒辦法了嗎?No!
可以在DICOM狀態(tài)讀取它的模態(tài)信息提前把各個(gè)模態(tài)分好類再轉(zhuǎn)格式。此時(shí)需要用到讀取DICOM信息的函數(shù)。使用Matlab或者Python都可以。我這里使用的是pydicom包。
使用dicominfo('filename') 函數(shù),比如:
使用如下命令可得到下圖的信息,然后從SeriesDescription一欄讀取掃描的該模態(tài)信息,比如這里是ep2d_bold_moco_p2:dicominfo('H:\xxx\xxx')

這是matlab讀取出來的結(jié)果:

這是pydicom讀取出來的結(jié)果:
import pydicom
filename = r"C://xxx//xxx.IMA"
dcm = pydicom.read_file(filename)
print(dcm)

會發(fā)現(xiàn)讀出來是一樣的,都包含了被試的很多信息。
就是這樣,The fishing skill is over。之后再迭代吧。
20190107