MATLAB_studentxx 2023-03-07 10:42 采纳率: 50%
浏览 22
已结题

python 实现对nii.gz图像的导入

我在数据库里找到的是.nii.gz一群类似的文字信息,我应该怎样下载导入?还是直接粘贴到什么地方呢,有没有懂得帮我解答一下,我太愚了

img

  • 写回答

1条回答 默认 最新

  • youcans_ 人工智能领域优质创作者 2023-03-07 10:49
    关注

    nii.gz文件是用0-33的数字来标记不同部位。推荐先按普通文件下载,再对nii.gz格式文件进行解析

    nii.gz格式文件解析的例程:

    import SimpleITK as sitk
    import numpy as np
    import os
    
    from PIL import Image
    
    
    def read_nii(file_path):
        ds = sitk.ReadImage(file_path)  # 读取nii数据的第一个函数sitk.ReadImage
        # print('ds: ', ds)
        data = sitk.GetArrayFromImage(ds)  # 把itk.image转为array
        # print('data: ', data)
        print('shape_of_data', data.shape)
        spacing = ds.GetSpacing()  # 三维数据的间隔
        # print('spacing_of_data', spacing)
        return data
    
    
    # 从十六进制的颜色得到RGB颜色
    def color(value):
        digit = list(map(str, range(10))) + list("ABCDEF")
        if isinstance(value, tuple):
            string = '#'
            for vi in value:
                a1 = vi // 16
                a2 = vi % 16
                string += digit[a1] + digit[a2]
            return string
        elif isinstance(value, str):
            a1 = digit.index(value[1]) * 16 + digit.index(value[2])
            a2 = digit.index(value[3]) * 16 + digit.index(value[4])
            a3 = digit.index(value[5]) * 16 + digit.index(value[6])
            return [a1, a2, a3]
    
    
    def getRGBColor(colorArray):
        colorMapRGB = []
        for i in range(len(colorArray)):
            colorMapRGB.append(color(colorArray[i]))
        return colorMapRGB
    
    # niiDataArray(读取nii文件获得的三维数组)
    # type(需要得到的图片的类型有1:横断面上下切、2矢状面左右切、3冠状面前后切)
    # imgId(获得的图片在该面的位置)
    def getImgFromNiiDataArray(niiDataArray, type, imgId, colorMap):
        shape = niiDataArray.shape
        if type == 1:
            imgData = np.array(niiDataArray[imgId, :, :])
        elif type == 2:
            imgData = np.array(niiDataArray[:, imgId, :])
        elif type == 3:
            imgData = np.array(niiDataArray[:, :, imgId])
    
        imgR = np.zeros(imgData.shape)
        imgG = np.zeros(imgData.shape)
        imgB = np.zeros(imgData.shape)
        imgA = np.zeros(imgData.shape)
        for i in range(1, 33):
            imgR[imgData == i] = colorMap[i - 1][0]
            imgG[imgData == i] = colorMap[i - 1][1]
            imgB[imgData == i] = colorMap[i - 1][2]
            imgA[imgData == i] = 255
    
        r = Image.fromarray(imgR).convert('L')
        g = Image.fromarray(imgG).convert('L')
        b = Image.fromarray(imgB).convert('L')
        a = Image.fromarray(imgA).convert('L')
        image = Image.merge('RGBA', (r, g, b, a))
        return image
    
    
    # 以png格式输出nii文件中三种视图的所有图片
    # 会在target目录下生成三个文件夹(横断面,矢状面,冠状面)
    # 里面装了对应得一系列png图片
    def exportAllImgByPNG(niiDataArray, targetPath):
        if os.path.exists(os.path.join(targetPath, '横断面')) == False:
            os.mkdir(os.path.join(targetPath, '横断面'))
        if os.path.exists(os.path.join(targetPath, '矢状面')) == False:
            os.mkdir(os.path.join(targetPath, '矢状面'))
        if os.path.exists(os.path.join(targetPath, '冠状面')) == False:
            os.mkdir(os.path.join(targetPath, '冠状面'))
    
        dataShape = niiDataArray.shape
        #
        for i in range(dataShape[0]):
            imge = getImgFromNiiDataArray(niiDataArray, 1, i, rgbColorMap)
            imge.save(os.path.join(targetPath, '横断面', '_' + str(i) + '.png'))
        for i in range(dataShape[1]):
            imge = getImgFromNiiDataArray(niiDataArray, 2, i, rgbColorMap)
            imge.save(os.path.join(targetPath, '矢状面', '_' + str(i) + '.png'))
        for i in range(dataShape[2]):
            imge = getImgFromNiiDataArray(niiDataArray, 3, i, rgbColorMap)
            imge.save(os.path.join(targetPath, '冠状面', '_' + str(i) + '.png'))
    
    
    # 33个颜色,分别对应牙槽骨和32颗牙齿的颜色,0为牙槽骨的颜色,1~32为牙齿的颜色
    colorMap = ['#00AA00', '#F93408', '#F57A34', '#F7951E', '#F6C238', '#FBE92F', '#E5F827', '#B6F313', '#97F922',
                '#75F72A',
                '#35F80A', '#23FD23', '#1DF645', '#37F57C', '#03FE8C', '#29FEC4', '#36FBE9', '#2CEBFE', '#29C1FA',
                '#048BFB',
                '#1B6CFA', '#153FFE', '#2F2FFD', '#3A10F4', '#610DF4', '#8F0AFD', '#B714F4', '#DE11F3', '#FE30EB',
                '#FD19BF',
                '#FB279B', '#FD1C6E', '#FD0532'
                ]
    
    
    
    
    if __name__ =='__main__':
        rgbColorMap = getRGBColor(colorMap)  # 得到各部位颜色
        # print(rgbColorMap)
    
        niifile_path = "./lvsili_label_tooth.nii.gz"
        # file_path = "./lvsiling_label_alveolar.nii.gz"
    
        niiDataArray = read_nii(niifile_path)
        exportAllImgByPNG(niiDataArray, './teethImg')
        # imge = getImgFromNiiDataArray(niiDataArray, 1, 100, rgbColorMap)
        # imge.show()
        # imge.save('./dog.png')
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月22日
  • 已采纳回答 3月14日
  • 创建了问题 3月7日

悬赏问题

  • ¥15 关于#c语言#的问题:构成555单稳态触发器,采用LED指示灯延时时间,对延时时间进行测量并显示(如楼道声控延时灯)需要Proteus仿真图和C语言代码
  • ¥50 神舟笔记本,没有linux的驱动,装的Ubuntu系统,想把风扇速度调到最大
  • ¥15 workstation加载centos进入emergency模式,查看日志报警如图,怎样解决呢?
  • ¥50 如何用单纯形法寻优不能精准找不到给定的参数,并联机构误差识别,给定误差有7个?matlab
  • ¥15 workstation加载centos进入emergency模式,查看日志报警如图,没有XFS,怎样解决呢?
  • ¥15 应用商店如何检测在架应用内容是否违规?
  • ¥15 Ubuntu系统配置PX4
  • ¥50 nw.js调用activex
  • ¥15 数据库获取信息反馈出错,直接查询了ref字段并且还使用了User文档的_id而不是自己的
  • ¥15 将安全信息用到以下对象时发生以下错误:c:dumpstack.log.tmp 另一个程序正在使用此文件,因此无法访问