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

2024-05-06 16:44

本文主要是介绍医学图像处理: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在进行模型训练。

这篇关于医学图像处理:nii格式转换(3D切片为2D)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/964849

相关文章

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Java如何将文件内容转换为MD5哈希值

《Java如何将文件内容转换为MD5哈希值》:本文主要介绍Java如何将文件内容转换为MD5哈希值的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java文件内容转换为MD5哈希值一个完整的Java示例代码代码解释注意事项总结Java文件内容转换为MD5