文章目录

  • 1.LUNA 2016 数据集详解
  • 2.mdh数据格式详解
  • 3.python读取mdh的方法
  • 4.annotations.csv坐标转换
  • 5.LUNA16数据集肺结节显示

1.LUNA 2016 数据集详解

LUNA16数据集的由来
LUNA 2016 数据集来自2016年LUng Nodule Analysis比赛,这里是其官方网站。
LUNA16数据集是最大公用肺结节数据集LIDC-IDRI的子集,LIDC-IDRI它包括1018个低剂量的肺部CT影像。LIDC-IDRI删除了切片厚度大于3mm和肺结节小于3mm的CT影像,剩下的就是LUNA16数据集了。
其数据集的文件内容如下:

subset0.zip~subset9.zip 包含所有CT图像的10个zip文件,数据格式为“.mhd”,“.raw”
CSVFILES文件夹,包括3文件:annotations.csv,candidates.csv,sampleSubmission.csv
annotations.csv:1186个肺结节信息,字段有seriesuid,coordX,coordY,coordZ,diameter_mm
candidates.csv:一共551065条数据。其中,正例(class:1):1351条,其余都是负例(class:0)
sampleSubmission.csv:正确格式的提交文件示例,我们不提交,暂时没用。

2.mdh数据格式详解

这里有一篇很好的文章,关于医疗影像的mhd和dcm格式图像的读取和坐标转换
每个病例的数据的存储都是由一个.mhd和一个.raw格式的文件组成。.mdh是说明文件,具体数据在.raw文件中,
mdh样例:

ObjectType = Image
NDims = 3          #三维数据
BinaryData = True              #二进制数据
BinaryDataByteOrderMSB = False
CompressedData = False
TransformMatrix = 1 0 0 0 1 0 0 0 1        #100,010,001 分别代表x,y,z
Offset = -195 -195 -378       #原点坐标
CenterOfRotation = 0 0 0
AnatomicalOrientation = RAI
ElementSpacing = 0.7617189884185791 0.7617189884185791 2.5     #像素间隔 x,y,z
DimSize = 512 512 141        #数据的大小 x,y,z
ElementType = MET_SHORT
ElementDataFile = 1.3.6.1.4.1.14519.5.2.1.6279.6001.173106154739244262091404659845.raw      #数据存储的文件名

3.python读取mdh的方法

mhd已经交代了图像数据的信息,接下来对图像数据进行读取,这里主要用的Python中的SimpleITK库

import SimpleITK as sitk
import matplotlib.pyplot as plt
case_path = './1.3.6.1.4.1.14519.5.2.1.6279.6001.126264578931778258890371755354.mhd'
itkimage = sitk.ReadImage(case_path)   #这部分给出了关于图像的信息,可以打印处理查看,这里就不在显示了
#print(itkimage)
image = sitk.GetArrayFromImage(itkimage)     #z,y,x
#查看第100张图像
plt.figure()
plt.imshow(image[100,:,:]) 

4.annotations.csv坐标转换

annotations.csv中提供了医生标注肺结节位置信息
seriesuid:表示每个病例图像对应的文件名
coordX,coordX,coordX,diameter_mm:表示医生标注的结节位置信息和直径

在使coordX用卷积网络对肺结节进行检测时,我们需要根据医生提供的标注信息,在图像中找到相应的肺结节位置,接下来说医生标注的坐标与图像中的坐标的关系。
mhd中给定了图像中的原点坐标为(-195 ,-195 ,-378) #x,y,z
像素间隔为(0.7617189884185791,0.7617189884185791,2.5) #x,y,z
通过以上信息可以计算结节相对原点的坐标,然后用这个坐标除以像素间隔,即为在图像中对应的结节位置
#世界坐标转换到图像中的坐标

def worldToVoxelCoord(worldCoord, origin, spacing):stretchedVoxelCoord = np.absolute(worldCoord - origin)voxelCoord = stretchedVoxelCoord / spacingreturn voxelCoord

#图像上的坐标转换为世界坐标

def VoxelToWorldCoord(voxelCoord, origin, spacing):strechedVocelCoord = voxelCoord * spacingworldCoord = strechedVocelCoord + originreturn worldCoord

5.LUNA16数据集肺结节显示

LUNA16数据集肺结节显示代码如下:

import SimpleITK as sitk
import matplotlib.pyplot as plt
import numpy as np
filename='data\\1.3.6.1.4.1.14519.5.2.1.6279.6001.173106154739244262091404659845.mhd'
itkimage = sitk.ReadImage(filename)#读取.mhd文件
OR=itkimage.GetOrigin()
print(OR)
SP=itkimage.GetSpacing()
print(SP)
numpyImage = sitk.GetArrayFromImage(itkimage)#获取数据,自动从同名的.raw文件读取def show_nodules(ct_scan, nodules,Origin,Spacing,radius=20, pad=2, max_show_num=4): # radius是正方形边长一半,pad是边的宽度,max_show_num最大展示数show_index = []for idx in range(nodules.shape[0]): # lable是一个nx4维的数组,n是肺结节数目,4代表x,y,z,以及直径if idx < max_show_num:if abs(nodules[idx, 0]) + abs(nodules[idx, 1]) + abs(nodules[idx, 2]) + abs(nodules[idx, 3]) == 0:continuex, y, z = int((nodules[idx, 0]-Origin[0])/SP[0]), int((nodules[idx, 1]-Origin[1])/SP[1]), int((nodules[idx, 2]-Origin[2])/SP[2])print(x, y, z)data = ct_scan[z]radius=int(nodules[idx, 3]/SP[0]/2)#pad = 2*radius# 注意 y代表纵轴,x代表横轴data[max(0, y - radius):min(data.shape[0], y + radius),max(0, x - radius - pad):max(0, x - radius)] = 3000 # 竖线data[max(0, y - radius):min(data.shape[0], y + radius),min(data.shape[1], x + radius):min(data.shape[1], x + radius + pad)] = 3000 # 竖线data[max(0, y - radius - pad):max(0, y - radius),max(0, x - radius):min(data.shape[1], x + radius)] = 3000 # 横线data[min(data.shape[0], y + radius):min(data.shape[0], y + radius + pad),max(0, x - radius):min(data.shape[1], x + radius)] = 3000 # 横线if z in show_index: # 检查是否有结节在同一张切片,如果有,只显示一张continueshow_index.append(z)plt.figure(idx)plt.imshow(data, cmap='gray')plt.show()b = np.array([[-116.2874457,21.16102581,-124.619925,10.88839157],[-111.1930507,-1.264504521,-138.6984478,17.39699158],[73.77454834,37.27831567,-118.3077904,8.648347161]])
show_nodules(numpyImage,b,OR,SP)

结果图像,三张图,其中一张如下:

全卷积神经网路【U-net项目实战】LUNA 2016 数据集详解相关推荐

  1. 全卷积神经网路【U-net项目实战】U-Net源码上实现自己数据集的分割任务

    文章目录 环境: 数据集准备: 主要代码: 接下来是训练,此处将训练和测试分开在两个.py文件中,好调用! 接下来就是愉快的测试了:main_test.py 测试结果部分展示:(裂缝检测) 问题 : ...

  2. 全卷积神经网路【U-net项目实战】语义分割之U-Net详解

    文章目录 1.简介 2.U-net典型应用 3. U-net详解 4.参考文献 1.简介 语义分割(Semantic Segmentation)是图像处理和机器视觉一个重要分支.与分类任务不同,语义分 ...

  3. 全卷积神经网路【U-net项目实战】Unet++

    文章目录 前言 概述 细节部分 1.一张结构图 & 解释: 2.loss:binary cross-entropy和dice coefficient两部分的组合.以下的loss应用到每一个不同 ...

  4. 全卷积神经网路【U-net项目实战】U-Net网络练习题: Kaggle - 2018 Data Science Bowl

    因为Kaggle有该比赛,而且code写的很简单易懂,于是乎拿来玩一下. https://www.kaggle.com/keegil/keras-u-net-starter-lb-0-277?scri ...

  5. 全卷积神经网路【U-net项目实战】论文中U-Net网络实现

    文章目录 设计神经网络的一般步骤 Unet网络设计的步骤 Unet网络最重要的特征 示例代码 设计神经网络的一般步骤 设计框架 设计骨干网络 Unet网络设计的步骤 设计Unet网络工厂模式 设计编解 ...

  6. 全卷积神经网路【U-net项目实战】ISBI 挑战数据集图像分割-keras实现

    文章目录 1.数据准备 2.程序准备 3.运行网络 4.测试结果 5.参考 1.数据准备 原始数据:首先准备数据,参考数据来自于 ISBI 挑战的数据集.数据可以在(https://github.co ...

  7. 全卷积神经网路【U-net项目实战】肺结节分割案例分析:DSB3Tutorial

    文章目录 本文要分析的代码作者是jonrmulholland 数据集: 重要文件介绍: 第一步:运行LUNA_mask_extraction.py,生产images_#.npy,masks_#.npy ...

  8. 全卷积神经网路【U-net项目实战】U-net网络结构为什么在医学影像分割上表现不错

    文章目录 前言 个人的理解: 1.医学图像边界模糊.梯度复杂,需要较多的高分辨率信息,深度学习可以做到这一点,比如上采样下采样以及skip connection和concatenation 2.待分割 ...

  9. Go语言从入门到精通 -【web项目实战篇】- Json详解

    本节核心内容 介绍GoLang自带的json包的核心功能方法 介绍如何利用Tag对Json结构体实现更多的控制 介绍Json的编码器和解码器 介绍如何解决复合结构体的数据读取问题 介绍了开发中一些常见 ...

最新文章

  1. 14级团队学习成果汇报 -- 利用express+socket.io搭建简易版聊天室
  2. java hello work_Java入门教程系列 – 第一个程序 “hello, world”
  3. 折腾一天总结下安装centos的安装方法。。。
  4. PHP学习之八:执行运算符与字符加一
  5. 找到数组中和为给定值的两个数
  6. sas table将缺失值计入百分比_SAS:通过数据块填充缺失值
  7. 基于网络索引树的异常轨迹检测算法
  8. Swift学习笔记_数据类型_整数类型
  9. 【LKJ】LKJ弧形限速小结
  10. 程序员如何写工作日志?
  11. 用之前使用正常的keil工程调试程序时,一直卡在 0x00000000 的解决方案
  12. 360手机:360N6Lite Twrp、Root、Magisk教程
  13. java实现极简单的 TXT小说阅读器(第四版)
  14. IC设计之CDC(跨时钟域)问题
  15. 使用微信企业机器人发送信息
  16. 亚马逊抛出“下一代贸易链”整合解决方案:中国跨境电商如何借道转型?
  17. 基于闪电搜索算法的函数寻优算法
  18. SPICE的器件模型
  19. python文件读写原理的一些理解:r,r+,w,w+,a,a+,以及seek()方法
  20. 机器学习+NLP+VR:重塑二手车买车新场景

热门文章

  1. opengl 预览摄像头
  2. python bytes' is not JSON serializable
  3. 网球hcc http catcher使用方法以及规则分享
  4. 【交换机】交换机如何配置光电复用接口
  5. 组播基本概念、IGMP、IGMP监听学习笔记
  6. 计算机等级考试2018改革,2018全国计算机等级考试调整方案公布,这些科目取消了!...
  7. java memorycache原理_JVM代码缓存区CodeCache原理及用法解析
  8. Maven项目提示:源值1.5已经过时,将在未来发行版中删除
  9. android 加载列表占位,使用Glide从URL加载占位符以在加载GIF时显示(Android)
  10. mysql 约束 域_MySQL-约束