美文网首页认知神经科学
毫不优雅地把各个模态杂乱无章混在一起的DICOM文件独立划分出来

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

作者: Galory | 来源:发表于2019-01-16 22:37 被阅读7次

    毫不优雅地把各个模态杂乱无章混在一起的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文件独立划分出来

        本文链接:https://www.haomeiwen.com/subject/bdkvdqtx.html