[python]-SimpleITK模块-医学影像标注nii.gz文件的读取与保存

SimpleITK模块以多种语言为 ITK 提供简化的接口,支持Python、R、Java、C#、Lua、Ruby、TCL 和 C++ 中的开源多维图像分析,由 Insight Toolkit 社区为生物医学科学及其他领域开发。
官方文档链接:https://simpleitk.org/#

在实际使用中,医学影像标注nii.gz文件的读取与保存用它比较方便。

nii.gz文件的读取

import SimpleITK as sitk
import skimage.io as io

def read_img(path):
    img = sitk.ReadImage(path)
    data = sitk.GetArrayFromImage(img)
    # print(data.shape)
    return data

nii.gz文件保存为标注json文件

import os
import numpy as np
import cv2
import SimpleITK as sitk
import json

def read_img(path): # 读取nii.gz文件
    img = sitk.ReadImage(path)
    data = sitk.GetArrayFromImage(img)
    # print(data.shape)
    return data

def save_json(save_path, dict_name): # 存为json文件
    jsonData = json.dumps(dict_name)
    with open(save_path,'w') as jsonf:
        jsonf.write(jsonData)

def copy_ (back, img, size): # 标注之外的地方作为背景类
    # print(type(img), img.shape)
    for i in range(size[0]):
        for j in range(size[1]):
            if img[i][j] > 0:
                back[i][j] = 0
    return back

def resize_ann(img, size): # 将图像转换到需要的尺寸
    path = 'mid_path.jpg' # 中间文件,先保存再以灰度图模式读取
    cv2.imwrite(path, img)
    # print(path,size)
    original_img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
    # print(original_img.shape)
    resize_img = cv2.resize(original_img, size, cv2.INTER_NEAREST)
    # print(resize_img.shape)
    # cv.imwrite('save_path.jpg', resize_img)
    return resize_img

def save_ann(path1, path2):

    # 例如有两种标注,分别存在path1和path2,且含有多层
    img_arr1 = read_img(path1)
    img_arr2 = read_img(path2)

    x=0
    img_arr_size = img_arr1.shape
    # print(img_arr.shape)

    # 读取niigz
    for i in range(img_arr1.shape[0]):

        img_need1 = img_arr1[i,:,:]
        img_need2 = img_arr2[i,:,:]

        # 检查是否需要转置
        # img_need = img_need.T
        # print(img_need)
        # 检查标注值
        # print(np.max(img_need))

        # 统一尺寸大小为(512,512)
        resize_size = (512,512)
        if np.max(img_need1) == 0:
            im_0 = np.zeros((512,512), dtype="uint8")
        else:
            # 如果尺寸不一需要转换
            im_0 = resize_ann(img_need1, resize_size)
            im_0[im_0>1]=1

        if np.max(img_need2) == 0:
            im_1 = np.zeros((512,512), dtype="uint8")
        else:
            im_1 = resize_ann(img_need2, resize_size)
            im_1[im_1>1]=1

        back = np.ones((512,512), dtype="uint8")
        back = copy_(back, im_0, resize_size)
        back = copy_(back, im_1, resize_size)

        im_0 = im_0.tolist()
        im_1 = im_1.tolist()
        back = back.tolist()

        imglist = []
        for x in [im_0, im_1, back]:
            imglist.append(x)

        if not os.path.exists(path_ann):    #  如果不存在就创建文件夹
            os.mkdir(path_ann)

        path_ann = 'save_path' + 'save_name'

        save_json(path_ann, imglist)

分割结果保存为nii.gz文件

import os
import numpy as np
import cv2
import SimpleITK as sitk
import json

def save_niigz(save_path, save_pred):

    # 如果有标注可能需要继承相关参数,包括图像尺寸等
    img = sitk.ReadImage('ann_path')

    # 获取标注数组
    # nii_img = sitk.GetArrayFromImage(img)

    # 从标注获取相关参数
    origin = img.GetOrigin() #order: x, y, z
    type = img.GetOrigin() #order: x, y, z
    spacing = img.GetSpacing() #order:x, y, z
    direction = img.GetDirection()
    size = img.GetSize()
    size = (size[0], size[1])
    # print(size)

    # 修改数据类型,例如分类信息用sitkLabel
    pixelType = sitk.sitkLabelUInt8
    out = sitk.Image(size,pixelType)

    res = []
    for i in range(len(save_res)):
        # 保证每一层的尺寸统一
        res.append(resize_ann(save_pred[i], size, ))

    out = sitk.GetImageFromArray(res)
    out.SetDirection(direction)
    out.SetSpacing(spacing)
    out.SetOrigin(origin)
    # 直接输出可以查看参数信息
    # print(out)

    sitk.WriteImage(out, save_path)

关于数据类型的问题可以查阅
文档说明1
文档说明2

其他操作参考以下笔记:
http://www.360doc.com/content/20/1128/18/460_948421999.shtml

Original: https://www.cnblogs.com/camilia/p/16697344.html
Author: CAMILIA
Title: [python]-SimpleITK模块-医学影像标注nii.gz文件的读取与保存

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/683347/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • windows守护进程工具–nssm详解

    nssm详解 零、文章目录 一、nssm简介 nssm是一个服务封装程序,它可以将普通exe程序封装成服务,实现开机自启动,同类型的工具还有微软自己的srvany,不过nssm更加…

    技术杂谈 2023年5月31日
    0116
  • 报错:OSError: libnccl.so.2: cannot open shared object file: No such file or directory

    因为没有安装nccl,本机为centos7 https://developer.nvidia.com/nccl/nccl-legacy-downloads 需要登录一下 得到ncc…

    技术杂谈 2023年6月1日
    0100
  • PI规划会,研发团队价值聚焦的一剂良方

    随着数字化建设如火如荼地推进,中大型企业的数字化建设团队规模也越来越大,团队规模的扩大一方面带来了更多产能与可能性,另一方面,不同的角色在不同的业务场景也带来了一些现实问题,例如:…

    技术杂谈 2023年7月24日
    082
  • Vue具体步骤

    0、准备:注册淘宝镜像 npm config set registry https://registry.npm.taobao.org/ 1、第一步:全局安装@vue/cli np…

    技术杂谈 2023年6月1日
    075
  • mybatis总结

    第一步 第二步 <build>        <resources>       &#…

    技术杂谈 2023年7月11日
    087
  • 如何管理分布式团队

    如何管理分布式团队 如今,寻找和雇用所有必要的人才来建立你的数字产品是具有挑战性的。因此,许多企业选择替代解决方案,并将其项目的某些部分外包。因此,他们可以扩大专业知识,实现更大的…

    技术杂谈 2023年6月1日
    083
  • redis持久化存储

    redis持久化存储 redis多被用于缓存和消息中间件,当被用作缓存时,数据的读写都是在内存中进行的,而内存一旦在主机断电或者主机重启时里面的数据将被清空,为保证数据不被丢失,r…

    技术杂谈 2023年7月11日
    063
  • JZ0047:二叉树剪支

    title:二叉树剪支 📃 题目描述 题目链接:二叉树剪支、相同题目 🔔 解题思路 第一种做法:dfs,思考方式是你站在一个点上怎么做,在一个点上,先看左子树是否要删除,再看看右子…

    技术杂谈 2023年7月24日
    083
  • 在图像上增加文字 C#

    using (Image i = Image.FromFile(inputPath)) { using (Graphics g = Graphics.FromImage(i)) {…

    技术杂谈 2023年6月1日
    091
  • Spark在standalone中关于core的参数设置

    最近发现,在执行pyspark任务时,对pythonFunction的CPU使用率进行限制存在问题,究其根本,还是sparkConf的参数存在问题。 梳理了下spark启动参数中关…

    技术杂谈 2023年6月21日
    084
  • 别被带节奏

    很多人说”好佩服某某某,他总能问出精彩的问题”,其实原因很简单,你跟着讲师节奏做无用功时,他在思考。 今天老婆跟我讲了一件事。她约了几个宝妈,带小孩去游乐场…

    技术杂谈 2023年7月11日
    066
  • 日常白痴_Date的比较及增减操作

    一直以来,获取日期都是用new Date(),再不然,顶多用个SimpleDateFormat规范一下格式忽然遇到需求,需要对日期增加和比较大小的时候,就又懵住了,唉,每天都为自己…

    技术杂谈 2023年7月25日
    073
  • 聊一聊Redis事务

    没错,Redis也有事务管理,但是功能很简单,在正式开发中也并不推荐使用。但是面试中有可能会问到,所以本文简单谈一谈Redis的事务。 通过这篇文章,你会了解 Redis为什么要提…

    技术杂谈 2023年7月23日
    076
  • Samba:文件共享

    samba:现主要用于Linux与Windows之间的文件共享。 samba的特点: 用于Linux与Windows之间进行文件共享和打印机共享 不仅用于Windows之间的文件共…

    技术杂谈 2023年7月11日
    079
  • Using Wireshark SIP Analysis for VoIP scenarios

    Using Wireshark SIP Analysis for VoIP scenarios Using Wireshark SIP Analysis for VoIP scen…

    技术杂谈 2023年5月31日
    0136
  • @Autowired注解 注入的是单例还是多例

    前言:我在用@Autowired注解时候一直 好奇 他是每次给我的对象是同一个 还是 每次new一个新的给我 看了一些文档后发现@Autowired是单例模式 因为它:在注入之前,…

    技术杂谈 2023年5月30日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球