医学图像处理:nii格式转换(3D切片为2D)

目录

NIFTI文件结构

读取NII文件

ITK-SNAP安装

使用方法

NII转PNG


NIFTI文件结构

      NIFTI 格式,是一种用于存储和交换医学成像数据的文件格式,特别适用于神经影像学领域。NIFTI文件通常有两个扩展名:.nii(用于图像数据)和 .hdr(用于头文件,包含有关图像的元数据)。这两个文件是成对出现的,.hdr 文件包含有关图像数据的详细信息,如尺寸、方向、数据类型等,而 .nii 文件则包含实际的图像数据。

读取NII文件

      在医学图像上,nii格式通常用于存储3D的图像,其中包含了多个2D切片的集合。这些切片按顺序排列,共同构成了3D图像数据。如果想要可视化NII文件,一般会将其切片转换为2D图像或直接使用ITK-SNAP软件查看。由于目前我所训练的图像数据均为2D,因此我采用了纵向切片的方法处理,但在此之前需要查看图像数据是否有损坏。

ITK-SNAP安装

官网链接:http://www.itksnap.org/pmwiki/pmwiki.php?n=Downloads.SNAP4

最新版本:https://sourceforge.net/projects/itk-snap/

这里根据自己的电脑配置下载,后面正常安装即可

使用方法

打开ITK-SNAP软件 - > file - > Open Main Image

下面显示的就是一个数据信息保存完整的nii文件

这个只是很简单的查看一个 .nii 文件是否能够正常显示,ITK-SNAP软件对于3D图像的处理很有帮助,但我对3D图像数据的处理方式并不熟悉,因此并未深入探讨,如果有想要深入了解该软件的使用方法,请移步ITK-Snap 处理医疗影像。

NII转PNG

      由于目前我所接触训练数据都是2D图像,而生物医学工程竞赛中提供的数据集大部分都是这种 nii 格式的文件,因此在遇到这种 nii 文件时我都会先将其转换为PNG格式的图像在进一步处理。这里给大家提供一个第9届生物医学工程竞赛的题目:基于CT图像的肝细胞癌肿瘤区域分割

百度网盘链接:https://pan.baidu.com/s/1KWSAJyP0MdwblihkbrFHOg

提取码:hwj3

网盘里面包含官方提供的数据集以及题目文档,感兴趣的可以跟着一起尝试一下

一个数据集通常包含图像和标签,二者一一对应,这里两个都需要转换

import os
import nibabel as nib
import imageio
import numpy as np
from tqdm import tqdmdef nii_to_image(filepath, imgfile):filenames = os.listdir(filepath)  # 读取nii文件夹with tqdm(total = len(filenames)) as pbar:for f in filenames:if f[-7:] != ".nii.gz":continueimg_path = os.path.join(filepath, f)img = nib.load(img_path)  # 读取niiimg_fdata = img.get_fdata(dtype=np.float32)  # 读取为float32fname = f.replace('.nii.gz', '')  # 去掉nii的后缀名img_f_path = os.path.join(imgfile, fname)# 创建nii对应的图像的文件夹if not os.path.exists(img_f_path):os.mkdir(img_f_path)  # 新建文件夹# 将归一化的浮点数数据转换为8位整数数据img_fdata = (img_fdata * 255).astype(np.uint8)# 开始转换为图像(x, y, z) = img.shapefor i in range(z):  # z是图像的序列slice = img_fdata[:, :, i]  # 选择哪个方向的切片都可以# 保存图像,使用PNG格式imageio.imwrite(os.path.join(img_f_path, '{}.png'.format(i)), slice)pbar.update(1)file_name = r"E:\Desktop\生医竞赛:CT肝细胞\liver_tumor_segmentation\imagesTr"
img_path = r"E:\Desktop\0"
nii_to_image(file_name, img_path)

此处使用纵向切片的方法(可以按需要修改为其它方向),对每一个3D图像切片为2D图象并保存为PNG格式(保存的图像格式也可以改为JPG或其它格式)

这里 file_name 是包含NII文件的文件夹路径,img_path 是输出图像文件夹的路径,自己修改即可

这相当于对一个具有体积的物体进行切片,因此每一个3D图像都会得到数量不一的2D图像

生成的image图像

生成的label图像

label中可以看到有些图像是全黑的,说明这些label对应的image图像中并没有病变的区域,而这些图像是我们训练所不需要的,因此需要去除这些无效的image图像以及对应的label,并且由于切片操作使得图像数量庞大,手动去除的话肯定是非常耗时的,因此这里也提供去除无效image图像方法,但这个有很大的弊端:需要手动去除label里面全黑的图像

import os
import shutildef remove_unmatched_image_subfolders(image_dir, label_dir):label_subfolders = {os.path.basename(f) for f in os.listdir(label_dir) if os.path.isdir(os.path.join(label_dir, f))}for image_subfolder in os.listdir(image_dir):image_subfolder_path = os.path.join(image_dir, image_subfolder)# 检查image中的子文件夹是否以_0000结尾,如果是,去除_0000后再进行匹配if image_subfolder.endswith("_0000"):image_subfolder_base = image_subfolder[:-5]  # 去除_0000# 如果image中的子文件夹的基准名称(去除_0000后)不在label的子文件夹列表中,则删除if image_subfolder_base not in label_subfolders:print(f"Deleting unmatched subfolder in image: {image_subfolder}")shutil.rmtree(image_subfolder_path)# 设置test文件夹中image和label的路径
test_folder_path = r'E:\Desktop\example'
image_folder_path = os.path.join(test_folder_path, 'image')
label_folder_path = os.path.join(test_folder_path, 'label')# 删除image中与label不匹配的子文件夹
remove_unmatched_image_subfolders(image_folder_path, label_folder_path)print("Cleanup completed.")

去除后的效果

这样上面得到的数据集就可以用于常规的神经网络训练咯。其实3D的图像数据也可以直接用于网络训练,但是目前博主并未进行深入的学习,因此处理这种数据时都会先将其转换为2D在进行模型训练。

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

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

相关文章

VMP 简单源码分析

虚拟机 获取CPU的型号 实现了一个指令集解释器,每个操作码对应一个特定的处理函数,用于执行相应的指令操作。在执行字节码时,解释器会根据操作码查找并调用相应的处理函数来执行指令。 截获异常 先由虚拟机处理 处理不了再抛出异常 priva…

MySql#MySql安装和配置

目录 一、卸载不需要的环境 二、安装mysql yum 源 三、开始安装 四、如果保证安装成功呢? 五、MySql 启动! 六、登录mysql 七、配置文件说明 八、设置开机启动! 本次安装是在Linux环境在centos7中完成 首先先将自己切换成root 一、…

基于springboot实现图书电子商务网站系统项目【项目源码+论文说明】

基于springboot实现图书电子商务网站系统演示 摘要 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱…

flowable流程跳转或退回到网关上的用户节点后流程走不下去了

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

【JVM】class文件格式,JVM加载class文件流程,JVM运行时内存区域,对象分配内存流程

这篇文章本来只是想讲一下class文件格式,讲着讲着越讲越多。JVM这一块吧,知识比较散比较多,如果深研究下去如死扣《深入理解Java虚拟机》,这本书很深很细,全记住是不可能的,其实也没必要。趁这个机会直接把…

如何快速找出文件夹里的全部带有中文纯中文的文件

首先,需要用到的这个工具YTool: 度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 步骤 1、打开工具,切换到批量复制文件 2、鼠标移到右侧,点击搜索添加 3、设定查找范围、指定为文件、勾选 包含全部子文件夹&…

FP16与BF16区别

二者都是占用16bit空间。 FP16由1个符号位、5个指数位和10个尾数位组成。FP16在表达小数时具有较高的精度,但表示的最大范围相对BF16比较小。相比BF16,在表达较大的数时更容易出现上溢的情况。BF16由1个符号位、8个指数位和7个尾数位组成。相比于FP16&a…

RFC 791 (1)-导论

目录 浅论 IP是啥 IP可以管啥 操作 范例查看 提示:本系列将会开始RFC文档阅读,这里会给出我的一些笔记 浅论 我们这篇RFC文档描述的是IP和ICMP协议,我们都知道,在传统的OSI七层或者是现在被简化的五层:应用层&…

2024年Q1季度果酒行业线上市场数据分析:女性消费力量强劲!

随着短视频推广和健康饮酒理念的盛行,果酒凭借酒精度数低、口味丰富、富含多种营养成分等优势逐渐受到了消费者的青睐。 Q1季度,消费者对果酒需求依旧旺盛。根据鲸参谋数据显示,今年Q1季度,线上电商平台(某猫&#xf…

6S管理,真的有必要吗?

工厂里的物料不知道是什么时间堆放的,不知道这个是谁的,不知道还有没有用,不知道该不该处理掉,越积越多,想要的东西总是找不着,不要的东西总是“碍手碍脚”……可怕的是大家对这一些现象习以为常。 说起6S…

搬运5款小众,无广告,实用性拉满的软件

​ 你是否喜欢一些小众且无广告的软件?如果是的话,我这边有一些给你推荐的。 1.屏幕录制——OBS Studio ​ OBS Studio是一款广泛使用的实时流媒体和屏幕录制软件,适用于Windows、MacOS、Linux平台。它采用C、C和Qt编写,提供高质…

Keepalived实现LVS高可用

6.1 KeepalivedLVS集群介绍 Keepalived和LVS共同构建了一个高效的负载均衡和高可用性解决方案:LVS作为负载均衡器,负责在集群中的多个服务器间分配流量,以其高性能和可扩展性确保应用程序能够处理大量的并发请求;而Keepalived则作…

如何使用DEEPL免费翻译PDF

如何使用DEEPL免费翻译PDF 安装DEEPL取消PDF限制 安装DEEPL 安装教程比较多,这里不重复。 把英文pdf拖进去,点翻译,在下面的框中有已经翻译完毕的文档。 但是存在两个问题 问题1:这些文档是加密的。 问题2:带有DeepL标…

C#知识|上位机UI设计-详情窗体设计思路及流程(实例)

哈喽,你好啊,我是雷工! 上两节练习记录了登录窗体和主窗体的实现过程,本节继续练习内容窗体的实现,以下为练习笔记。 01 详情窗体效果展示: 02 添加窗体并设置属性 在之前练习项目的基础上添加一个Windows窗体,设置名称为:FrmIPManage.cs 设置窗体的边框和标题栏的外…

flink sql 优化

文章目录 一、参数方面二、资源方面三、总结 提示:实时flink sql 参考很多网上方法与自己实践方法汇总(版本:flink1.13) 一、参数方面 flink sql参数配置 //关闭详细算子链(默认为true),true后job性能会略微有提升。false则可以展示更详细的DAG图方便地位性能结点…

go mod

常用命令 初始化模块 go mod init 模块名下载 go.mod 文件中指明的所有依赖 go mod download github.com/gin-gonic/ginv1.9.(依赖路径)依赖对其(使引用的都是所依赖的) go mod tidy编辑go.mod go mod edit go mod edit -require"github.com/g…

jvm 马士兵 01 JVM简介,class文件结构

01.JVM是什么 JVM是一个跨平台的标准 JVM只识别class文件,符合JVM规范的class文件都可以被识别 u1 是一个字节 u2是两个字节

5款采用AMD Instinct MI300芯片的超酷AI和HPC服务器

我们收集了戴尔科技、联想、超微和技嘉的五款超酷人工智能和高性能计算服务器,这些服务器使用 AMD 的 Instinct MI300 芯片,该芯片于几个月前推出,旨在挑战 Nvidia 在人工智能计算领域的主导地位。 AMD 正在凭借其 Instinct MI300 加速器芯片…

新手必看!场外个股期权的权利金估算公式

场外个股期权的权利金估算公式 场外个股期权的权利金估算公式通常涉及多个因素,这些因素共同决定了权利金的具体数额。虽然具体的估算公式可能因不同的交易平台、交易规则和标的资产而有所差异,但一般来说,权利金的计算会考虑以下几个关键要…

毕业单纯的钻研嵌入式知识有前景吗?

毕业之后单纯地去钻研嵌入式知识到底有没有前景呢?不可否认的是,嵌入式领域有着较高的薪资待遇,并且还存在着巨大的上升空间。然而,要学习嵌入式开发并非易事,其中存在着诸多挑战。其中一个挑战就是需要深入理解计算机…