image.png最近处理实验室数据,遇到新的需求:每个病人的每次MRI的多张dicom图像按照所属的序列自动分类存储,并提取出想要的序列;But原始影像所有dicom文件都是在一起的,如下图所示。
image.png
所有序列都是混乱在一起的
用MicroDicom viewer打开整个文件夹能够到清晰的序列结构:
image.pnglocalizer为定位序列,t2_tse_tra_fs为t2序列,t1_tse_tra为t1序列,
ep2d_diff_tra_spair为DWI序列(扩散加权成像),ep2d_diff_tra_spair_ADC为ADC序列,t1_fl3d_tra_dyna_1+5_NEW为增强序列(后面为注射完对比剂后5个不同时间的增强序列)
在网上找类似的程序实现,只找到matlab代码,python实现的没找到,自己根据其思路用python实现了想要的结果。
1.导入需要的包
import glob
import os
import pydicom
import shutil
import re
2.读取一个文件夹里面全部的dicom文件
#待处理的原始影像文件路径
InFolderName = 'D:/FinishedDataTotal/part3_3.0T/2019-12-11/00225718';
#存储的分类影像文件路径
saveFolderName=InFolderName.replace("FinishedDataTotal","NewData")
print(saveFolderName)
#读取灭个dicom文件的路径,并存入list
dcm_paths = glob.glob(os.path.join(InFolderName,"MR","**","**.dcm"))
print(len(dcm_paths))
print(dcm_paths[1])
3.定义需要分类的序列
#T1 T2 DWI ADC
need_Series = ['t2_tse_tra_fs','t1_tse_tra','ep2d_diff_tra_spair','ep2d_diff_tra_spair_ADC']
#DCE
DCE_Series = ['t1_fl3d_tra_dyna_1+5','t1_fl3d_tra_dyna_1+5_NEW']
4.读取文件中序列名称,按照序列名新建文件夹,把图片放到对应的文件夹里面去
for i in range(len(dcm_paths)):
size = os.path.getsize(dcm_paths[i])
#判断某个dcm文件的大小是否为 0,是则移除这个dcm文件
if size == 0:
os.remove(path)
else:
dcm = pydicom.read_file(dcm_paths[i])
#protocolname = dcm.ProtocolName
seriesUid,seriesName = dcm.SeriesInstanceUID,dcm.SeriesDescription
if seriesName in need_Series:
tmp_save_Folder = os.path.join(saveFolderName,seriesName)
source_File = dcm_paths[i].replace("/",'\\')
#去掉不需要的字符
tmp_save_Folder = tmp_save_Folder.replace("<",'').replace(">",'')
tmp_save_Folder = tmp_save_Folder.replace("\\",'/')
if not os.path.exists(tmp_save_Folder):
os.makedirs(tmp_save_Folder)
shutil.copy(source_File,tmp_save_Folder)
elif seriesName in DCE_Series:
source_File = dcm_paths[i].replace("/",'\\')
tmp_save_Folder = os.path.join(saveFolderName,'DCE'+str(seriesUid)[-1])
if not os.path.exists(tmp_save_Folder):
os.makedirs(tmp_save_Folder)
shutil.copy(source_File,tmp_save_Folder)
5.得到最终的分类的序列
image.png说明:参考或转发本文需注明本文链接,尊重知识产权,社区才能更好地发展,有什么问题请联系小编2210432548@qq.com
网友评论