【BraTS】Brain Tumor Segmentation 脑部肿瘤分割1(数据篇)

2023-10-19 06:40

本文主要是介绍【BraTS】Brain Tumor Segmentation 脑部肿瘤分割1(数据篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Brats

一、BraTS比赛数据概要

BraTS全名是Brain Tumor Segmentation ,即脑部肿瘤分割。世界卫生组织(WHO)按细胞来源和行为对脑肿瘤进行分类:

  • 非恶性脑肿瘤被分类为I级或II级,也被称为低度(low grade, LG)肿瘤,LG肿瘤不会严重影响患者的预期寿命
  • 恶性肿瘤被分类为III级或IV级,被称为高度(high grade, HG),与HG肿瘤的最大预期寿命只有两年不同

从神经影像学方法对脑肿瘤进行分割是改善疾病诊断,治疗计划,监测和临床试验的关键步骤。需要可靠的脑肿瘤分割来检测肿瘤的位置和范围。

然而,脑肿瘤的准确分割极具挑战性,这些肿瘤几乎可以以任何形状和大小出现在不同的位置。另外,它们通常对比度差,并且肿瘤的强度值可能与健康的脑组织的强度值重叠。

因此,将健康组织与肿瘤区分开来并不容易。解决此问题的常用方法是整合从多种MR模态中获取的信息,模态包括:

  • T1加权MRI(T1),
  • 加造影剂的T1加权MRI(T1c)
  • T2加权MRI(T2)
  • 液体衰减反转恢复(FLAIR)MRI。

根据所需的人机交互程度,脑肿瘤分割方法主要分为3类:

  • 手动
  • 半自动
  • 全自动分割。

在MR图像中手动分割脑肿瘤是一项非常艰巨的任务,既耗时又受评估者差异的影响。因此,在过去的二十年中,可靠的脑肿瘤自动和半自动分割技术引起了人们的广泛关注,并产生了数百种不同的算法。

这些算法中有许多是在私有数据集上实现和评估的。私有数据集在输入数据(使用的成像方式),脑肿瘤的类型和疾病状态(治疗前或治疗后)方面差异很大,以至于很难比较所提出的分割方法的性能。

为了解决这个问题,自2012年以来,医学影像计算和计算机辅助干预协会(MICCAI)发起了多模态脑肿瘤影像分割挑战(BRATS)。BraTS数据库包含大量的多模态脑部扫描,可公开获取,并用于开发和测试最新的脑肿瘤分割算法。

BraTS 比赛官方网址:http://www.braintumorsegmentation.org/
BraTS 2015下载地址:https://aistudio.baidu.com/aistudio/datasetdetail/26367

下面,我们就可以从上面的网址中,下载到我们需要的脑肿瘤数据了。若要查看下载下来的图像,我们可以使用标注软件ITK-SNAP进行查看。其中每一个病例的文件夹下面,都是由这5个文件组成的,(除测试集外,测试集无标签文件),分别是:

  • XXX.Flair 液体衰减反转恢复MRI
  • XXX.T1 加权MRI
  • XXX.T1c 加造影剂的T1加权MRI
  • XXX.T2 T2加权MRI
  • XXX.OT label,标签内容0,1,2,3,4 背景+4类

文件格式都是.mha,直接拖动mha文件到ITK-SNAP进行查看,记得需要拖动模态文件和OT标签文件,如下展示:

1
你可能会比较好奇其中的五颜六色的标签,各个颜色代表不同的标签,后面我们会对标签进行数据可视化处理,便于处理。这里可以先看如下描述:

1
注释:带有手动注释的三种成像模式(A = FLAIR,B = T2,C = T1c)上的肿瘤外观,以及右侧的三个标签的融合(D)。从左到右,分别是:

  • 全肿瘤(黄色)
  • 肿瘤核心(红色)
  • 增强肿瘤核心(浅蓝色)
  • 核心的囊性坏死成分(绿色))

二、图层图像处理

医学影像中的数据,大多就那么几个行业标准的数据形式。比如dicom、nii、npz、mhd等其他格式,尤其是以上述几种数据格式为多。

有些是可以存储二维数据的,例如x光,有些是存储三维数据的,例如ct、mri等断层扫描数据。当然在处理这些数据的时候,python也有专门的第三方库。

  • pydicom是专门处理dicom的库
  • SimpleITK可以处理nii、npz、mhd这些三维数组

更多关于医学数据处理的部分,比如图像转换等等,可以参考这里:nii、npz、npy、dcm 的数据处理,及多目标分割处理汇总

本数据的处理,主要遵循下面步骤:

  • 读取mhd文件
  • 逐层获取单层标签图像
  • 查看会发现很多像素值是超过255 的。所以直接保存图像就会产生截断,使得图像偏白,像素丢失。
  • 先归一化到0-255,再保存
  • 保持为图像

完整代码如下:

import random
from PIL import Image
import SimpleITK as sitkdef load_mha_as_array(img_name):"""get the numpy array of brain mha image:param img_name: absolute directory of 3D mha images:return:nda  type: numpy    size: 150 * 240 * 240"""img = sitk.ReadImage(img_name)nda = sitk.GetArrayFromImage(img)return ndadef get_subject():# **************** get file ****************path = r'F:\data_sample\HGG\brats_2013_pat0001_1\VSD.Brain.XX.O.MR_Flair.54512.mha'img = load_mha_as_array(path)print(img.shape)for i in range(img.shape[0]):oneImg_arr = img[i]print(oneImg_arr.shape)print(set(oneImg_arr[oneImg_arr != 0]))np.savetxt(r"img.txt", oneImg_arr, delimiter=',', fmt='%5s')max_pix = np.amax(oneImg_arr)label_train = oneImg_arr / max_pix  # 归一化image = Image.fromarray(label_train * 255)image = image.convert("L")image.save("./data/Flair/" + "image_" + str(i) + ".png")if __name__=='__main__':get_subject()

保存好图像的截图如下:

图片
同理,标签部分的保存同样如此,后面就是

三、标注标签处理

标签文件就是那个带OT字样的,这里记录了断层扫描每一层的类别标记情况。根据我们从前面用ITK_SNAP软件可以猜想下,这个标签文件记录的应该是个三维数据,层数据x每一层的宽x每一层的高。

下面把这个标签文件单独处理下,直观的看看是什么样子的,代码部分和对上面图像处理的差不多,主要步骤如下:

  • 读取mhd文件
  • 逐层获取单层标签图像
  • 查看发现标签数组是0、1、2、3、4,不利于显示
  • 归一化,从0-4,拉伸到0-255(这里仅仅作为展示方便的处理)
  • 保持为图像

直接看下面代码吧:

import random
from PIL import Image
import SimpleITK as sitk
def load_mha_as_array(img_name):"""get the numpy array of brain mha image:param img_name: absolute directory of 3D mha images:return:nda  type: numpy    size: 150 * 240 * 240"""img = sitk.ReadImage(img_name)nda = sitk.GetArrayFromImage(img)return ndadef get_subject():"""label   4D numpy    155 * 240 * 240"""# **************** get file ****************path = r'F:\data_sample\HGG\brats_2013_pat0001_1\VSD.Brain_3more.XX.O.OT.54517\VSD.Brain_3more.XX.O.OT.54517.mha'img = load_mha_as_array(path)print(img.shape)for i in range(img.shape[0]):oneImg_arr = img[i]print(oneImg_arr.shape)if oneImg_arr[oneImg_arr != 0].size > 0:print(set(oneImg_arr[oneImg_arr != 0]))np.savetxt(r"img.txt", oneImg_arr, delimiter=',', fmt='%5s')max_pix = np.amax(oneImg_arr)label_train = oneImg_arr / max_pix  # 归一化image = Image.fromarray(label_train * 255)# image = Image.fromarray(oneImg_arr)image = image.convert("L")image.save("./data/ot/" + "image_" + str(i) + ".png")if __name__=='__main__':get_subject()

生成标签存储到本地的结果:

data-label关于上述生成标签的数据处理详细部分,参考这里:nii、npz、npy、dcm 的数据处理,及多目标分割处理汇总

四、总结

对医学数据了解多了,你就会发现。医学数据的存储形式、标签存储形式几乎都是大同小异,甚至可以说就是一样的。

本文中的脑补肿瘤分割挑战赛的数据不一样的地方就是,它是多模态的,光输入数据就是4个模态,每一个模态都是一个三维的断层扫描数据。

这也就意味着,输入数据更复杂了。4个模态输入,对应预测1个输出。一般的断层数据,比如CT数据预测肺癌结节的LIDC数据,是1个三维数据,对应到1个输出,就简单了很多。

到这里,了解了一些基本的数据结构和内容,包括:

  • Brats比赛的数据,是有4个模态的
  • 每一个模态的大小都是155*240*240,150层240*240的断层扫描
  • 4个模态预测一个分割任务,分割的目标有4个类别+1个背景
  • 如何将4个模态的信息给综合利用起来?是本分割任务的重中之重,也是模型设计的出彩点

由上面的不一样,自然也就成了后面设计网络时候的创新点。思考两个问题:

  • 综合各个模态的信息:如何把4个模态给并联的作为输入?
  • 综合单模态上下层三维信息:如何考虑MRI的三维断层,层与层之间的联系?

本系列接下来的几篇文章,就是对上述问题进行拆解。有训练和测试的代码?关注不迷路,敬请期待。

参考文章:
1.使用多模态脑部扫描数据的自动脑肿瘤分割
2. lstm_multi_modal_UNet
3.医学影像数据集集锦

这篇关于【BraTS】Brain Tumor Segmentation 脑部肿瘤分割1(数据篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)