之前有解释预处理部分的函数,不过觉得还不够详细,同时文字解释还不够直观,所以现在想一步步运行下,打印输出

首先读取原始数据,包括相应的注释(即结节标签)【注意】注释文件中的标签是按x,y,z的顺序给的,但是origin以及spacing都是按照z,y,x的顺序,所以要逆序处理一下([:,::-1])

raw_data,origin,spacing,isflip = load_itk_image("/home/dataset/LUNA16/subset3/1.3.6.1.4.1.14519.5.2.1.6279.6001.126631670596873065041988320084.mhd")annos = np.array(pandas.read_csv("/home/dataset/LUNA16/CSVFILES/annotations.csv")) this_annos = np.copy(annos[annos[:,0]==("1.3.6.1.4.1.14519.5.2.1.6279.6001.126631670596873065041988320084")])raw_label = (this_annos[:,1:-1][:,::-1]-origin)/spacing

然后输出下原始数据的shape,以及标签的内容

print(raw_data.shape)
print(raw_label)

输出

(272, 512, 512) [[83.84986792 232.12420469969365 348.18196764820215]  [229.169256536 308.7302064585643 158.2345410262112]]

然后可视化其中一张切片

plt.imshow(raw_data[229])

效果

现在开始进入预处理流程

之前读取过原始数据,此处不再读取,除原始数据及标签外,还需要读取LUNA16为每个CT提供的掩码,用于剔除肺部以外区域

Mask,origin,spacing,isflip = load_itk_image("/home/dataset/LUNA16/seg-lungs-LUNA16/1.3.6.1.4.1.14519.5.2.1.6279.6001.126631670596873065041988320084.mhd")

掩码是与CT图像同样大小的三维图像,区别在于掩码只有0,1两种值,这张CT的大小是(272,512,512),掩码也是(272,512,512)

值得注意的是此处的掩码却并不是0,1二值,而是0,3,4三种值,0依然代表肺部以外区域,3代表左肺,4代表右肺,为便于将肺部一起处理,还需要将左右两个肺合并一下

m1 = Mask==3    #LUNA16的掩码有两种值,3和4
m2 = Mask==4
Mask = m1+m2

然后这里做了一个我认为没那么重要但是给处理带来很多麻烦的环节,那就是对掩码求取边界(肺部边界),只保留边界内的数据

不妨想象一个正方形,里面有一个小圆,小圆就是掩码,那么此处做的就是求小圆的最小外接矩形,将矩形外的部分砍掉

xx,yy,zz= np.where(Mask)
box = np.array([[np.min(xx),np.max(xx)],[np.min(yy),np.max(yy)],[np.min(zz),np.max(zz)]])

打印输出看一下box

array([[ 21, 264],        [130, 407],        [ 62, 441]])

做到这,预处理已经差不多了,再加几步

box = box*np.expand_dims(spacing,1)/np.expand_dims(resolution,1)  #对边界即掩码的最小外部长方体应用新分辨率 box = np.floor(box).astype('int')

打印输出

array([[ 26, 330],        [ 96, 302],        [ 46, 327]])

对这个边界向外扩展一点,为了处理边缘的像素

margin = 5 extendbox = np.vstack([np.max([[0,0,0],box[:,0]-margin],0),np.min([newshape,box[:,1]+2*margin],axis=0).T]).T

打印输出

array([[ 21, 340],        [ 91, 312],        [ 41, 337]])

然后对掩码进行一点处理

convex_mask = m1       dm1 = process_mask(m1)                     #对掩码采取膨胀操作,去除肺部黑洞 dm2 = process_mask(m2) dilatedMask = dm1+dm2 Mask = m1+m2  extramask = dilatedMask ^ Mask        #异或操作,求出相比于原始掩码膨胀后多出来的区域

这里mask的大小没有变过,仍然是(272,512,512)

bone_thresh = 210 pad_value = 170 sliceim = lumTrans(sliceim)   #对原始数据阈值化,并归一化 sliceim = sliceim*dilatedMask+pad_value*(1-dilatedMask).astype('uint8')  #170对应归一化话后的水,掩码(膨胀过后)外的区域补充为水 bones = (sliceim*extramask)>bone_thresh                        #210对应归一化后的骨头,凡是大于骨头的区域都填充为水 sliceim[bones] = pad_value

此时CT数据即sliceim的大小也没有变过,现在要变化一下,进行重采样

sliceim1,_ = resample(sliceim,spacing,resolution,order=1)

查看下此时的大小

(340, 380, 380)

最后还记得之前求的box吗,我们只需要box内的数据即可

sliceim2 = sliceim1[extendbox[0,0]:extendbox[0,1],         #将extendbox内数据取出作为最后结果                     extendbox[1,0]:extendbox[1,1],                     extendbox[2,0]:extendbox[2,1]]

处理完数据,还需要处理标签

之前已经将世界坐标转换为体素坐标,现在要对其应用新的分辨率(这里取[1,1,1])

raw_label = raw_label*spacing/resolution

输出

array([[104.8123349, 172.279793861, 258.41647013999994],        [286.46157067, 229.13584731999998, 117.43977386999997]], dtype=object)

最后的最后,减去box的下界

得到

[[83.84986792 232.12420469969365 348.18196764820215]  [229.169256536 308.7302064585643 158.2345410262112]]

上面处理过的数据和标签与完整预处理后的clean.npy和label.npy是一样的,证明这个分解的过程没什么纰漏

完结,撒花

转载于:https://www.cnblogs.com/wzyuan/p/9910009.html

对DeepLung数据预处理部分的详细展示相关推荐

  1. matlab预处理光谱数据,一种近红外光谱数据预处理方法与流程

    本发明公开了属于近红外光谱分析技术领域,尤其涉及一种近红外光谱数据预处理的新方法,主要用于建立近红外定量和定性模型时对近红外光谱数据的预处理. 背景技术: 近红外光谱技术具有分析速度快.样本制作简单的 ...

  2. Kaggle Titanic Challenges 生存预测 数据预处理 模型训练 交叉验证 步骤详细解析

    本博客所有内容均整理自<Hands-On Machine Learning with Scikit-Learn & TensorFlow>一书及其GitHub源码. 看<Ha ...

  3. 整理一份详细的数据预处理方法

    作者:lswbjtu https://zhuanlan.zhihu.com/p/51131210 编辑:机器学习算法与Python实战 为什么数据处理很重要? 熟悉数据挖掘和机器学习的小伙伴们都知道, ...

  4. Py之scikit-learn:机器学习sklearn库的简介、六大基本功能介绍(数据预处理/数据降维/模型选择/分类/回归/聚类)、安装、使用方法(实际问题中如何选择最合适的机器学习算法)之详细攻略

    Py之scikit-learn:机器学习sklearn库的简介(组件/版本迭代).六大基本功能介绍(数据预处理/数据降维/模型选择/分类/回归/聚类).安装.使用方法(实际问题中如何选择最合适的机器学 ...

  5. 光滑噪声数据常用的方法_整理一份详细的数据预处理方法

    重磅干货,第一时间送达 作者:lswbjtuhttps://zhuanlan.zhihu.com/p/51131210 为什么数据处理很重要? 熟悉数据挖掘和机器学习的小伙伴们都知道,数据处理相关的工 ...

  6. EasyUI DataGrid DetailView(数据表格详细展示带子表格)

    Mark一下EASY UI 的数据表格详细展示使用记录. 第一步:创建页面布局 这一步主要是引用Easy UI的JS,除了easyui.min.js还有datagrid-detailview.js & ...

  7. 机器学习工程实例 垃圾邮件过滤系统 数据预处理 训练模型 交叉验证 精准率召回率计算 步骤详细解析

    本博客所有内容均整理自<Hands-On Machine Learning with Scikit-Learn & TensorFlow>一书及其GitHub源码. 看<Ha ...

  8. ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略

    ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略 目录 三.模型训练 ...

  9. ML之FE:特征工程/数据预处理中的数据异常值的概述、检测方法、处理方法技巧总结之详细攻略

    ML之FE:特征工程/数据预处理中的数据异常值的概述.检测方法.处理方法技巧总结之详细攻略 目录 异常值 异常值的概述(简介/原因/影响) 异常值的检测方法

最新文章

  1. signature=680da11b802226668317d65ae7c38eb7,encryption with designated verifiers
  2. Puppet学习之文件管理
  3. 一周一论文(翻译)——[SIGMOD 2015] TIMELY RTT-based Congestion Control for the Datacenter
  4. Linux之awk:按照字符或列进行筛选与计算列值 条件动作
  5. 社交系统ThinkSNS-plus(TS+)V1.0发布!
  6. linux shell下除了某个文件外的其他文件全部删除的命令
  7. CUDA ---- Warp解析
  8. matlab gui怎样将结果保存在excel中_声发射简单使用matlab导入参数波形数据并绘图...
  9. 2w字详解数据湖:概念、特征、架构与案例
  10. java命名不规范会怎样_java命名规范:注重细节
  11. python 余弦值,Python向量余弦值 Python 求向量的余弦值操作
  12. 配置Firefox火狐浏览器burpsuite https抓包
  13. 通过GCN来实现对Cora数据集节点的分类
  14. 华硕笔记本升级固态SSD过程
  15. 红外平行光管ZEMAX光学设计/SOLIDWORKS
  16. 中兴力维喜获“中国智慧城市创新应用金奖”
  17. 硬盘分区备忘(主分区,扩展分区和逻辑分区)以及Linux硬盘分区工具parted 介绍...
  18. Qt编写可视化大屏电子看板系统25-模块3设备监控
  19. JavaScript判断当前浏览器是否为IE或者Edge
  20. Leetcode 1419:数青蛙(超详细的解法!!!)

热门文章

  1. 基于阿里云、小程序、Arduino的温湿度监控系统(完整源码以及实现步骤)
  2. PADS VX2.8 元件的参考编号与管脚的交换方法
  3. 每天高效短睡4小时与饥饿的力量
  4. django的setting.py文件配置
  5. 再次挑战自己,骑行成都天府绿道100公里
  6. Redis持久化有两种方式:快照持久化(RDB)和AOF
  7. 论文阅读 (32):Conformal Multi-Instance Kernels (2006)
  8. win10redis php,redis安装新手教程(win10)
  9. AIGC跨过奇点时刻,亚马逊云科技展露新峥嵘
  10. 28 CoCos Creator-快速上手:制作第一个游戏