肺结节3D图像分割-VNet(一)

2024-03-22 21:59
文章标签 图像 分割 3d 结节 vnet

本文主要是介绍肺结节3D图像分割-VNet(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

近期用Yolo训练肺结节检测模型感觉缺少3D结构信息,尝试一下3D图像分割,博文用以记录。

1、LUNA16数据集

1.1 Luna16数据集介绍

简介:来自于公开的LIDC/IDRI数据集。该数据集剔除了LIDC/IDRI数据集中切片厚度大于2.5mm的扫描数据,共产生了888套CT。Luna16数据集中结节的判定标准为四名放射科专家中至少有三名认定该结节半径大于3mm。因此在数据集的注释中,非结节、半径小于3mm的结节和被1名或两名放射科专家认为是半径大于3mm的结节被认定为无关的发现。

1.2 所用数据

Luna16数据集:

点此跳转

subset0-subset10:10个zip文件中包含的所有的CT图像。

annotations.csv:包含1186个结节的注释。

LIDC/IDRI数据集:

点此跳转

LIDC-XML-only.zip:放射科医生注释/分割(XML 格式)

1.3  mhd文件和raw文件

subset0-10中每一个病例的CT扫描都给出了.mhd和.raw

.mhd文件包含了CT图像的基本信息,.raw文件用来储存CT的图像

1.4 annotations.csv文件

文件包含了各个CT中结节的世界坐标和半径

2、图像预处理

2.1 读取结节图像信息

从subset0-9中找到.mhd文件,读取图像相关信息

def read_data(mhd_file):       #读取图像数据,img, origin, spacing, flagwith open(mhd_file) as f:mhd_data = f.readlines()for i in mhd_data:     if i.startswith('TransformMatrix'):tmp = i.split('=')[1]if tmp == '1 0 0 0 1 0 0 0 1\n':   #判断是否翻转flag = Trueelse:flag = Falseitkimage = sitk.ReadImage(mhd_file)numpyImage = sitk.GetArrayFromImage(itkimage)   #从mhd读取raw,图像print("读取数据,读取的图片大小(zyx):",numpyImage.shape)origin = itkimage.GetOrigin()print("读取数据,读取的坐标原点(xyz):",origin)  #x,y,zspacing = itkimage.GetSpacing()print("读取数据,读取的像素间隔(xyz):",spacing)  #x,y,zreturn numpyImage, origin, spacing, flag

2.2 坐标变换

从annotations.csv文件读取到的坐标是世界坐标系下的坐标,我们需要将其转换为图像坐标系下的坐标,像素间隔为[1,1,1].

需要注意的是一张CT图像可能包含不止一个结节,我们需要将其全部遍历完才能遍历下一张图

annos_all_list = []           #读取到的原始坐标for i in range(len(annos)):if annos[i][0] == img_name:  annos_all_list.append(list(annos[i])) print(annos_all_list)

读取到图像包含的所有结节后,将其进行坐标转换

    for annos_one_list in annos_all_list:       #其中一个结点print("annos_one_list:",annos_one_list) #世界坐标w_center = [annos_one_list[1], annos_one_list[2], annos_one_list[3]]  #世界坐标:[x,y,z]print("世界坐标:",w_center)#世界坐标 --> 图像坐标#(世界坐标中心 - 原点) / 像素间隔v_center = list(abs(w_center - np.array(origin)))#/np.array(spacing) 此处像素间隔为[1,1,1] 图像坐标:[x,y,z]if flag is False:  #图像翻转,拍CT时为俯拍,需转换为仰拍. #img.shape(z,y,x)   v_center(x,y,z)v_center = [(img.shape[2]-1 - v_center[0]), (img.shape[1]-1 - v_center[1]), v_center[2]]    #z轴不需要翻转diam = annos_one_list[4]   #直径print("结节直径:",diam)

将转换后的结节坐标保存下来

one_annos = []
one_annos.append(v_center[0])  #图像坐标x
one_annos.append(v_center[1])  #图像坐标y
one_annos.append(v_center[2])  #图像坐标z
return_list.append(one_annos)
print("one_annos:",one_annos,"[坐标(x,y,z)]")

2.3 结节信息保存 

所有结节全部转换完后,将保存的数据保存输出至nodule_annos.xls文件

nodule_annos = pd.DataFrame(nodule_list)  # 把nodule_list转换成excel文件
nodule_annos.to_excel(nodule_annos_path)   #保存至指定路径

查看输出文件

 

2.4  滤除不含结节图像

def annos_clean():annos = pd.read_excel(nodule_annos_path)annos = annos.tolist()annos_c = []for i in annos:if i[2] != "[]":annos_c.append(i[1])return annos_c

这篇关于肺结节3D图像分割-VNet(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python如何将大TXT文件分割成4KB小文件

《Python如何将大TXT文件分割成4KB小文件》处理大文本文件是程序员经常遇到的挑战,特别是当我们需要把一个几百MB甚至几个GB的TXT文件分割成小块时,下面我们来聊聊如何用Python自动完成这... 目录为什么需要分割TXT文件基础版:按行分割进阶版:精确控制文件大小完美解决方案:支持UTF-8编码

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

使用Python实现批量分割PDF文件

《使用Python实现批量分割PDF文件》这篇文章主要为大家详细介绍了如何使用Python进行批量分割PDF文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、架构设计二、代码实现三、批量分割PDF文件四、总结本文将介绍如何使用python进js行批量分割PDF文件的方法

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关