假设
读入的3D数据size大小为(75, 512,512)spacing为(0.703125, 0.703125, 5.0)(x,y,z)
我们需要把z轴的spacing调整为1mm
所以需要先计算真实3D数据的大小:(75*5, 512*0.703125, 512*0.706125) = (375, 360, 360)mm
x,y,z轴的spacing调整为1mm,也就是目前3D数据size = (375 / 1, 360 / 1, 360 / 1) =(375, 360, 360)换句话说,spacing为(0.703125, 0.703125, 5.0) 读入的3D数据size为(75, 512,512)
当spacing为(1, 1, 1),读取的3D数据的size为(375, 360, 360)而真实3D数据的大小是不变的,为(375, 360, 360)mm如果我们对读入的3D数据进行了降采样,例如降采样后的size是(375, 256, 256)
那么spacing应该是(375 / 375, 360 / 256, 360 / 256) 为 (1.40625, 1.40625, 1)上面说的是计算层面上的,对于代码层面,我们没有搞这么繁琐:我们对3D数据重采样和降采样,只需要一句话完成假设输入ct图像的size(非真实size)为(75, 512, 512),spacing为(0.703125, 0.703125, 5.0)
你希望把z轴spacing调整为1mm, 把图像下采样到256*256
你需要,
1.获得ct的spacing,÷你想要的spacing,ct.GetSpaing()[-1] / 1
2.获得下采样率,down_scale = 512 / 256
执行
ct_array = ndimage.zoom(ct_array, (ct.GetSpaing()[-1] / 1, down_scale, down_scale))
运行上述这句话
size会变成(75 * 5 / 1, 256, 256) = (375, 256, 256)
此时的size是你想要的,并且z轴的spacing已经变成1mm了,spacing为(375/375, 360/256,360/256) = (1.40625, 1.40625, 1)接下来你会对图像进行其他预处理操作,例如切片,等等
new_ct_array = 切片(ct_array)
new_ct = sitk.GetArrayFromImage(new_ct_array)
执行sitk.GetArrayFromImage,你的spacing会默认变成(1,1,1)(目前也不懂为什么)所以new_ct的sapcing要再设置成(1.40625, 1.40625, 1)
new_ct.SetSpacing((1.40625, 1.40625, 1))

这样才算完成了预处理操作

下面附上lits挑战赛预处理代码,帮助理解

"""
获取可用于训练网络的训练数据集
需要四十分钟左右,产生的训练数据大小3G左右
"""import os
import sys
sys.path.append(os.path.split(sys.path[0])[0])
import shutil
from time import time
import numpy as np
from tqdm import tqdm
import SimpleITK as sitk
import scipy.ndimage as ndimageimport lits_para as paraif os.path.exists(para.training_set_path):shutil.rmtree(para.training_set_path)new_ct_path = os.path.join(para.training_set_path, 'imgae')
new_seg_dir = os.path.join(para.training_set_path, 'label')# os.mkdir(para.training_set_path)
# os.mkdir(new_ct_path)
# os.mkdir(new_seg_dir)start = time()
os.listdir()
patients = os.listdir(para.train_ct_path)
patients.sort(key=lambda x:int(x.split('.')[0].split('-')[-1]))
for i in tqdm(range(len(patients))):# 将CT和金标准入读内存ct = sitk.ReadImage(os.path.join(para.train_ct_path, patients[i]), sitk.sitkInt16)ct_array = sitk.GetArrayFromImage(ct)seg = sitk.ReadImage(os.path.join(para.train_seg_path, patients[i].replace('volume', 'segmentation')), sitk.sitkUInt8)seg_array = sitk.GetArrayFromImage(seg)# 将金标准中肝脏和肝肿瘤的标签融合为一个seg_array[seg_array > 0] = 1# 将灰度值在阈值之外的截断掉# print(ct_array.max())# print(ct_array.min())# ct_array[ct_array > para.upper] = para.upper# ct_array[ct_array < para.lower] = para.lower# 对CT数据在横断面上进行降采样,并进行重采样,将所有数据的z轴的spacing调整到1mmprint(ct.GetSpacing())# ct(0.703125, 0.703125, 5.0)print(ct.GetSpacing()[-1] / para.slice_thickness, para.down_scale, para.down_scale)# 5.0 0.5 0.5ct_array = ndimage.zoom(ct_array, (ct.GetSpacing()[-1] / para.slice_thickness, para.down_scale, para.down_scale), order=3)seg_array = ndimage.zoom(seg_array, (ct.GetSpacing()[-1] / para.slice_thickness, para.down_scale, para.down_scale), order=0)# ct_array size从(75,512,512)->(375,256,256)# 其他操作# 找到肝脏区域开始和结束的slice,并各向外扩张slicez = np.any(seg_array, axis=(1, 2))start_slice, end_slice = np.where(z)[0][[0, -1]]# 两个方向上各扩张slicestart_slice = max(0, start_slice - para.expand_slice)end_slice = min(seg_array.shape[0] - 1, end_slice + para.expand_slice)# 如果这时候剩下的slice数量不足size,直接放弃该数据,这样的数据很少,所以不用担心if end_slice - start_slice + 1 < para.size:print('!!!!!!!!!!!!!!!!')print(patients[i], 'have too little slice', ct_array.shape[0])print('!!!!!!!!!!!!!!!!')continuect_array = ct_array[start_slice:end_slice + 1, :, :]seg_array = seg_array[start_slice:end_slice + 1, :, :]# 最终将数据保存为nii.gznew_ct = sitk.GetImageFromArray(ct_array)new_ct.SetDirection(ct.GetDirection())new_ct.SetOrigin(ct.GetOrigin())print((ct.GetSpacing()[0] * int(1 / para.down_scale), ct.GetSpacing()[1] * int(1 / para.down_scale), para.slice_thickness))# (1.40625, 1.40625, 1)# 最后调整好spacingnew_ct.SetSpacing((ct.GetSpacing()[0] * int(1 / para.down_scale), ct.GetSpacing()[1] * int(1 / para.down_scale), para.slice_thickness))new_seg = sitk.GetImageFromArray(seg_array)new_seg.SetDirection(ct.GetDirection())new_seg.SetOrigin(ct.GetOrigin())new_seg.SetSpacing((ct.GetSpacing()[0], ct.GetSpacing()[1], para.slice_thickness))sitk.WriteImage(new_ct, os.path.join(new_ct_path, 'volume-' + str(i) + '.nii.gz'))sitk.WriteImage(new_seg, os.path.join(new_seg_dir, 'segmentation-' + str(i) + '.nii.gz'))

关于spacing和重采样、降采样的理解相关推荐

  1. VTK修炼之道30:图像重采样_降采样和升采样技术

    1.VTK中的图像重采样实现 图像重采样是指对采样后形成的由离散数据组成的数字图像按所需的像元位置或像元问距重新采样,以构成几何变换后的新图像.重采样过程本质上是图像恢复过程,它用输入的离散数字图像重 ...

  2. 【图像处理】——改变图像的大小(降采样重采样)下采样和上采样

    转载自:https://jingyan.baidu.com/article/a3a3f81139be1f8da2eb8ade.html 上采样.下采样和金字塔加速参考:https://blog.csd ...

  3. python实现采样函数_python中resample函数实现重采样和降采样代码

    函数原型 resample(self, rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='s ...

  4. python 抽样函数_python中resample函数实现重采样和降采样代码

    函数原型 resample(self, rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='s ...

  5. 上采样,重采样和下采样,降采样

    一.上采样(重采样) 1.上采样就是重采样也就是放大图像,通常使用的目的是 (1)使图片达到更高的分辨率 (2)再经过pooling后上采样可以放大信息,循环迭代可以不断增强有用信息 2. 上采样原理 ...

  6. python中resample函数实现重采样和降采样

    函数原型 resample(self, rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='s ...

  7. python信号采样_python中resample函数实现重采样和降采样代码

    函数原型 resample(self, rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='s ...

  8. Pandas-时间序列(三)-重采样:改变TimeSeries的采样频率【降采样:高频数据 → 低频数据(以天为频率转为以月为频率)】【升采样:低频数据 → 高频数据(以年为频率转为以月为频率)】

    重采样:将时间序列从一个频率转换为另一个频率的过程,且会有数据的结合 降采样:高频数据 → 低频数据,eg.以天为频率的数据转为以月为频率的数据 升采样:低频数据 → 高频数据,eg.以年为频率的数据 ...

  9. 降采样处理 resample函数

    resample为信号重采样处理,理解如下: B=resample(x,90,250); % 采样从250Hz降到90Hz,如果250在前,就是插值从90到250,可 以看B的长度,250Hz采样40 ...

最新文章

  1. day4 数组的初始化和练习
  2. docker 日志_Filebeat 采集 Docker 日志
  3. U盘安装服务器2008系统蓝屏,U盘安装系统造成蓝屏如何解决
  4. linux 测试工具
  5. Node.js系列——(4)优势及场景
  6. win版跳过id锁工具_实测:一键跳过苹果锁,免费
  7. python内置函数系列之str(一)(持续更新)
  8. 杨勇博客之家-博客文章导航
  9. SOJ-4484-后缀数组
  10. 铁流:苹果为何不找IBM,而选择中国浪潮
  11. TIA博途_STEP7版本的升级与移植相关难点汇总
  12. 【Android】带你细看Android input系统中ANR的机制
  13. CString字符串操作
  14. Android开发的经典入门教材和学习…
  15. 手机网站新模式-3G门户HTML5概念版
  16. 【ESP32教程】ESP32EEPROM的使用(使用示例中的eeprom class用法)
  17. ACM-ICPC 2018 南京赛区网络预赛 E. AC Challenge(状压dp)
  18. 坦克小战的游戏规则说明(3)
  19. 阿里云HPC助力新制造 | 上汽仿真计算云SSCC
  20. cmd批处理,webStrom/phpStrom/.....IDE工具编译

热门文章

  1. 某公司要开发新游戏,请用面向对象的思想,设计游戏中的蛇怪和蜈蚣精
  2. ❤超级牛批,暴力破解聊天记录文件 ❤
  3. 亚马逊运营爆款产品技巧-跨境知道
  4. Nature’s 10——Nature发布2021年帮助塑造科学的十人名单
  5. day05数据类型(上)
  6. 微信二次分享解决图标文案失效方案
  7. 【Jmeter操作步骤】
  8. 《AngularJS深度剖析与最佳实践》一1.4 实现第一个页面:注册
  9. iOS主线程卡顿监测
  10. windos下 elasticksearch7.13安装踩坑记