Gradio 案例——将 dicom 文件转为 nii文件

news2024/11/13 14:51:07

文章目录

  • Gradio 案例——将 dicom 文件转为 nii文件
    • 界面截图
    • 依赖安装
    • 项目目录结构
    • 代码

Gradio 案例——将 dicom 文件转为 nii文件

  • 利用 SimpleITK 库,将 dicom 文件转为 nii文件
  • 更完整、丰富的示例项目见 GitHub - AlionSSS/dcm2niix-webui: The web UI for dcm2niix (DICOM to NIfTI converter)

界面截图

image.png

依赖安装

  • 新建一个虚拟环境 Python 3.9.16
  • 依赖
    • $ pip install gradio==4.29 -i "https://pypi.doubanio.com/simple/"
    • $ pip install SimpleITK==2.3.1 -i "https://pypi.doubanio.com/simple/"

项目目录结构

dicom2nii-webui       # 目录
--/lib_SimpleITK.py   # py文件
--/main.py            # py文件,入口

代码

  • lib_SimpleITK.py
import SimpleITK as sitk
import os


def dicom_to_nii(dicom_dir_path: str, nii_file_path: str):
    """
    dicom文件转nii文件
    """
    # 读取 dicom
    reader = sitk.ImageSeriesReader()
    img_name = reader.GetGDCMSeriesFileNames(dicom_dir_path)
    reader.SetFileNames(img_name)
    image = reader.Execute()
    # 转为 nii.gz
    image_array = sitk.GetArrayFromImage(image)
    image_out = sitk.GetImageFromArray(image_array)
    image_out.SetOrigin(image.GetOrigin())
    image_out.SetSpacing(image.GetSpacing())
    image_out.SetDirection(image.GetDirection())
    # 保存nii.gz文件到配置的目录下
    example_nii_dir_path = os.path.dirname(nii_file_path)
    if not os.path.exists(example_nii_dir_path) or not os.path.isdir(example_nii_dir_path):
        os.mkdir(example_nii_dir_path)
    sitk.WriteImage(image, nii_file_path)
  • main.py
import gradio as gr
import os
import zipfile
import lib_SimpleITK

example_dicom_dir_path = 'D:/project/xxx/Task/ABC_Test_02/xxx'
example_nii_file_path = 'D:/project/res/result_image.nii.gz'

def service_local_dicom_to_nii(dicom_dir_path: str, nii_file_path: str):
    # 校验
    if not dicom_dir_path or dicom_dir_path.strip() == "":
        gr.Warning(f"请填入[dicom文件目录路径],例如'{example_dicom_dir_path}'")
        return
    if not nii_file_path or nii_file_path.strip() == "":
        nii_file_path = os.path.join(dicom_dir_path, "result_image.nii.gz")

    try:
        lib_SimpleITK.dicom_to_nii(os.path.abspath(dicom_dir_path), os.path.abspath(nii_file_path))
    except Exception as e:
        raise gr.Error("dicom 转 nii 时,发生异常:" + str(e))
        
    return nii_file_path, nii_file_path 

    
local_iface = gr.Interface(
    fn=service_local_dicom_to_nii,
    inputs=[
        gr.Textbox(label="dicom文件目录路径", info=f"例如'{example_dicom_dir_path}'"),
        gr.Textbox(label="生成的nii文件路径", info=f"例如'{example_nii_file_path}'。如果不填,会输出到dicom目录下。")
    ],
    outputs=[gr.Textbox(label="生成的nii文件路径"), gr.File(label="生成的nii文件")],
    description="在本地电脑端启动时使用。利用 SimpleITK 库,将 dicom 文件转为 nii文件。",
)

def unzip_file(zip_file_path: str, save_dir_path: str):
    with zipfile.ZipFile(zip_file_path, "r") as zfile:
        # 中文有乱码问题
        zfile.extractall(save_dir_path)

def service_server_dicom_to_nii(file):
    # 解压
    save_dir_path = os.path.dirname(file.name)
    print(save_dir_path)
    unzip_file(file.name, save_dir_path)
    
    # dicom 转 nii
    dicom_dir_path = save_dir_path
    nii_file_path = os.path.join(save_dir_path, "result_image.nii.gz") 
    try:
        lib_SimpleITK.dicom_to_nii(dicom_dir_path, nii_file_path)
    except Exception as e:
        raise gr.Error("dicom 转 nii 时,发生异常:" + str(e))
        
    # return nii_file_path, nii_file_path
    return file.name, file.name 

server_iface = gr.Interface(
    fn=service_server_dicom_to_nii,
    inputs=[gr.File(label="dicom文件目录的压缩包(建议不要带中文)")],
    outputs=[gr.Textbox(label="生成的nii文件路径"), gr.File(label="生成的nii文件")],
    description="在服务器端启动时使用。利用 SimpleITK 库,将 dicom 文件转为 nii文件。",
)


tabbed_interface = gr.TabbedInterface(
    interface_list = [local_iface, server_iface], 
    tab_names = ["本地端", "通用端"],
    title="dicom 转 nii"
)
tabbed_interface.launch()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1680204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用MMDetection进行模型微调和权重初始化

目录 模型微调修改第一处:更少的训练回合Epoch修改第二处:更小的学习率Learning Rate修改第三处:使用预训练模型 权重初始化实际使用案例init_cfg 的具体使用规则初始化器配置汇总 本文基于 MMDetection官方文档,对模型微调和权重…

eMMC和SD模式速率介绍

概述 在实际项目开发中我们常见的问题是有人会问,“当前项目eMMC、SD所使用模式是什么? 速率是多少?”。这些和eMMC、SD的协议中要求的,要符合协议。接下来整理几张图来介绍。 eMMC 模式介绍 一般情况下我们项目中都是会支持到HS400 8bit 1.8V,最大时钟频率为200MHZ,通…

ESP8266-01模块继电器制作手机APP远程遥控智能开关

资料下载地址: ESP8266-01模块继电器制作手机APP远程遥控智能开关 这是一款使用ESP8266-01模块继电器制作手机APP远程遥控智能开关,它能实现远程遥控、定时、倒计时控制。电路简单,适合新手入门制作,下图是用这个智能开关制作的小…

springboot项目打包部署

springboot打包的前提条件jdk必须17以后不然本地运行不来(我用的jdk是22) 查看自己电脑jdk版本可以参考(完美解决Windows10下-更换JDK环境变量后,在cmd下执行仍java -version然出现原来版本的JDK的问题-CSDN博客) 1、…

treejs 3D+echart实现三维旋转炫酷导航网页

treejs 3Dechart实现三维旋转炫酷导航网页https://www.bilibili.com/video/BV1SM4m1C7ki/

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.1-2.2

目录 第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周:优化算法 (Optimization algorithms)2.1 Mini-batch 梯度下降(Mini-b…

07-Fortran基础--Fortran指针(Pointer)的使用

07-Fortran基础--Fortran指针Pointer的使用 0 引言1 指针(Poionter)的有关内容1.1 一般类型指针1.2 数组指针1.3 派生类(type)指针1.4 函数指针 2 可运行code 0 引言 Fortran是一种广泛使用的编程语言,特别适合科学计算和数值分析。Fortran 9…

【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)

🔍 目的 使用动态属性,并在保持类型安全的同时实现非类型化语言的灵活性。 🔍 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全,并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…

指针在函数的应用(C++)

一、传递地址 实参传递进函数体内后,生成的是实参的副本,在函数内改变副本的值并不影响实参。指针传递参数时,指针变量产生了副本,但副本与原变量指向的内存区域是同一个。改变指针副本指向的变量,就是改变原指针变量指…

Java 插入数据到Elasticsearch中进行各种类型文档的内容检索

源码下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1D3yszkTzjwQz0vFRozQl2g?pwdz6kb 提取码&#xff1a;z6kb 实现思路 1.搭建一个新的springboot项目&#xff0c;不会的请看我这篇博客&#xff1a;springboot项目搭建 2.添加maven依赖 <dependency><…

项目管理-案例重点知识(成本管理)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 三、成本管理 案例重点 成本管理 案例重点内容&#xff1a; &#xff08;1&#xff09;成本管理计划内容 &#xff08;2&#xff09;估算…

汇聚荣科技:拼多多上架商品后需要做页面推广吗?

在电商平台上&#xff0c;商品的曝光率和销量往往成正比。那么&#xff0c;当您在拼多多上架了新品&#xff0c;是不是就意味着坐等订单呢?答案显然是否定的。商品一旦上架&#xff0c;接下来需要做的就是通过有效的页面推广来增加商品的可见度&#xff0c;吸引潜在买家的注意…

23.HashMap的put方法流程

一、put方法的流程图 二、put方法的执行步骤 首先&#xff0c;根据key值计算哈希值。然后判断table数组是否为空或者数组长度是否为0&#xff0c;是的话则要扩容&#xff0c;resize&#xff08;&#xff09;。接着&#xff0c;根据哈希值计算数组下标。如果这个下标位置为空&a…

fastadmin对登录token的处理

fastadmin对token的操作 最近开发遇到一个场景&#xff0c;需要绕过验证获取登录&#xff0c;所以恶补了一下这个知识点&#xff0c;这个主要就是控制fastadmin的token的问题 代码分步实现 class Xcxuser extends Api {//关于鉴权protected $noNeedLogin [login,getopenid,…

踩坑小结:Linux安装python环境 、安装OpenSSL

一、查看python版本 查看发现&#xff0c;linux上自带了python&#xff0c;不过是2.x版本的。 二、下载python3 2.1 下载 www.python.org/downloads/s… 可在当前目录下找到相对应的版本或者最新版本下载 也可以直接下载 Python 3.10.4 下载完在服务器上选择一个目录存放…

ffmpeg使用xfade的转场特效

ffmpeg使用xfade的转场特效 1. 介绍2. ffmpeg里面的xfade3. 使用 1. 介绍 参考文档 ffmpeg是一个音视频编辑工具&#xff0c;具体的。。。。我才搞接触&#xff0c;所以不懂。 xfade是一种视频转场滤镜&#xff0c;用于在两个视频片段之间创建平滑的过渡效果。xfade的转场效果…

扭亏为盈的赛力斯,真正进入稳态了吗?

“72小时内大定破1万台”。5月15日&#xff0c;问界新M5开启全国大规模交付&#xff0c;从当前取得的成绩来看&#xff0c;赛力斯的“富贵”似乎还将延续。 其实&#xff0c;此前基于问界新M7等车型的爆火&#xff0c;赛力斯已经找到了创收轨道。财报显示&#xff0c;2024年一…

戒烟网站|基于SSM+vue的戒烟网站系统的设计与实现(源码+数据库+文档)

戒烟网站 目录 基于SSM&#xff0b;vue的戒烟网站系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1网站功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主…

每日5题Day3 - LeetCode 11 - 15

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxArea(int[] height) {//这道题比较特殊&#xff0c;因为两边是任意…

OPC-UA open62541 C++测试代码

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 这是之前写的open62541测试代码…