毫不优雅地把各个模态杂乱无章混在一起的DICOM文件独立划分出来

毫不优雅地把各个模态杂乱无章混在一起的DICOM文件独立划分出来。
话不多说,之前已经写过一篇文章讲述如何分类各个模态DICOM文件(http://www.xuwenhe.name/2019/01/niftidicom.html),也提到了如果对于转完格式后不好分类的情况,可以在对dicom原始文件读取模态相关的信息,然后分类。因此,把拖了很久的一堆数据在今天下午写了简单的代码把需要的T1、DTI和REST分出来。过程不难,但是文件夹的层次结构比较多,需要注意下。
主要用到的还是pydicom包里的read_file函数pydicom.read_fileSeriesDescription属性。
比如,

dcm = pydicom.read_file('文件名,比如abc.dcm' ,force=True)
# 输出dcm或者IMA文件的模态信息
print(dcm.SeriesDescription) 
#如果不知道SeriesDescription是描述模态信息,可以先完全输出dcm,在里边可以找到描述模态对应的标签名。

实际上,如果你对一个DICOM文件夹内存放的文件毫无头绪时,比如这样:

image.png

有一个很好的小软件 RadiAnt DICOM Viewer 可以帮你读取DICOM数据并可以把详细信息读取出来,当然也包括模态信息。

很有趣的一点是RadiAnt这个软件读取出来的模态信息名字跟上边用pydicom读取出来的一样,追本溯源殊途同归。

如下图,就是用 RadiAnt DICOM Viewer 读取出来的界面:

image.png

具体过程分为两步,第一步是新建文件夹为分类后的模态信息找好居住地,这一步用到的代码如下:

#!/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)

你可能感兴趣的:(毫不优雅地把各个模态杂乱无章混在一起的DICOM文件独立划分出来)