毫不优雅地把各个模态杂乱无章混在一起的DICOM文件独立划分出来。
话不多说,之前已经写过一篇文章讲述如何分类各个模态DICOM文件(http://www.xuwenhe.name/2019/01/niftidicom.html),也提到了如果对于转完格式后不好分类的情况,可以在对dicom原始文件读取模态相关的信息,然后分类。因此,把拖了很久的一堆数据在今天下午写了简单的代码把需要的T1、DTI和REST分出来。过程不难,但是文件夹的层次结构比较多,需要注意下。
主要用到的还是pydicom包里的read_file函数pydicom.read_file
和SeriesDescription
属性。
比如,
dcm = pydicom.read_file('文件名,比如abc.dcm' ,force=True)
# 输出dcm或者IMA文件的模态信息
print(dcm.SeriesDescription)
#如果不知道SeriesDescription是描述模态信息,可以先完全输出dcm,在里边可以找到描述模态对应的标签名。
实际上,如果你对一个DICOM文件夹内存放的文件毫无头绪时,比如这样:
有一个很好的小软件 RadiAnt DICOM Viewer 可以帮你读取DICOM数据并可以把详细信息读取出来,当然也包括模态信息。
很有趣的一点是RadiAnt这个软件读取出来的模态信息名字跟上边用pydicom读取出来的一样,追本溯源殊途同归。
如下图,就是用 RadiAnt DICOM Viewer 读取出来的界面:
具体过程分为两步,第一步是新建文件夹为分类后的模态信息找好居住地,这一步用到的代码如下:
#!/usr/bin/env python
#coding=utf-8
import os
import shutil
import re
def extract_file(path_name):
# make new directory
# directory_name = ['t1','t2','rest','dti','tof','aaheadscouts']
directory_name = ['t1','rest','dti']
for name in directory_name:
try:
os.makedirs(path_name + '/' + name)
# os.rmdir(path_name + '/' + name)
except:
continue
old_dir_name = 'G://xxx'
dir_name = 'G://xxx_done'
for i in os.listdir(dir_name):
# 这里只能循环一次
# os.makedirs(dir_name + r'//' + i)
new_dir_name = os.path.join(dir_name + r'//' + i)
extract_file(new_dir_name)
第二步,按照逻辑分类dicom文件并拷贝到新文件夹,这一步的代码如下:
# 20190116 MRI模态分类初步成功
import pydicom
import os
import shutil
def copy_modal(cur_old_path,tar_dir):
print(cur_old_path)
for file_file in os.listdir(cur_old_path):
print(file_file + ' 这是当前进行到的文件')
file_latest_name = os.path.join(cur_old_path + r'//' + file_file)
tar_dir_name = tar_dir + r'//' + file_file
shutil.copyfile(file_latest_name,tar_dir_name)
def classify(dir_name):
for i in os.listdir(dir_name):
# cur_path = os.path.join(dir_name + r'//'+ i)
# print(cur_path)
dcm = pydicom.read_file(dir_name + r'//' + i,force=True)
# print(dcm.SeriesDescription)
if dcm.SeriesDescription == 'Ax DTI 30':
# 读取模态信息
# print(dcm.SeriesDescription)
print("Hi,这个文件夹存放的是DTI")
copy_modal(dir_name,r'G://xxx_done' + r'//' + father_name + r'//' + 'dti')
# print(os.path.abspath(os.path.dirname(__file__)))
break
if dcm.SeriesDescription == 'BOLD-Resting':
# 读取模态信息
# print(dcm.SeriesDescription)
print("Hi,这个文件夹存放的是静息态REST模态")
copy_modal(dir_name,r'G://xxx_done' + r'//' + father_name + r'//' + 'rest')
# print(os.path.abspath(os.path.dirname(__file__)))
break
if dcm.SeriesDescription == 'SAG 3D-MPRAGE':
print("Hi,这个文件夹存放的是T1结构像")
copy_modal(dir_name,r'G://xxx_done' + r'//' + father_name + r'//' + 't1')
# print(os.path.abspath(os.path.dirname(__file__)))
break
else:
print("不好意思,这是你不需要的模态。")
break
# print(count)
# if 'SeriesDescription' in dcm:
# print(dcm.SeriesDescription)
# count += 1
# print(count)
'''
# print(dcm.SeriesDescription)
if 'SeriesDescription' in dcm:
if dcm.SeriesDescription == 'Axi DWI b=1000':
# 读取模态信息
print(dcm.SeriesDescription)
count += 1
print(count)
'''
# for i in os.listdir(dir_name):
# print(i)
# dcm = pydicom.read_file(dir_name + r'//' + i,force=True)
# print(dcm.file_meta)
# # for i in dcm:
# if 'SequenceName' in dcm:
# # 读取模态信息
# print(dcm.SequenceName)
# print(dcm.SequenceName)
# print(dcm.EchoTime)
current_dir = r'G://xxx'
for i in os.listdir(current_dir):
son_1_dir = os.path.join(current_dir + r'//' + i)
# print(son_1_dir)
if os.path.isdir(son_1_dir) == True:
# 获取父亲目录名字
father_name = i
# print(i)
# print(i)
for j in os.listdir(son_1_dir):
son_2_dir = os.path.join(son_1_dir + r'//' + j)
if os.path.isdir(son_2_dir):
# print(j)
for k in os.listdir(son_2_dir):
son_3_dir = os.path.join(son_2_dir + r'//' + k)
# print(son_3_dir)
classify(son_3_dir)