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 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。