LITS数据集预处理(二)
要求输出所有nii文件的size和spacing、origin、direction
size:nib库是(xyz),sitk为(zyx
origin:原始图像中心点在相机坐标系的位置
spacing:两个像素的间距
direction方向
写了一个代码可以同时输出文件名和对应spacing,size与其他可以同样代入
import os
import SimpleITK as itk
import numpy as npdef checksize(files):for i in (files):vol=itk.ReadImage(path+i)#filename,fileexp=os.path.split(i) 没用spacing=vol.GetSpacing()print(i,end=' ') #执行不想换行操作,这里的i输出就是名字,如果需要去掉拓展名则需要用split操作print(spacing)path='D:/test/'
files=os.listdir(path)
checksize(files)
原先预处理的代码被师兄改了一下,因为归一化是错的,还加了一些插值方法,这里记录一下:还有一个问题就是处理完后的数据比原来的大了很多,后来发现是因为有些图像spacing很大,重采样之后会大很多,有些很小会小很多。(这里我们重采样的方法是将spacing全部集合起来取中位数,大约取的是0.7,0.7,1.0)
import numpy as np
import SimpleITK as itk
import os
import matplotlib.pyplot as pltdef nii(files, newspacing=[0.7, 0.7, 1.0]): # 设定新spacing为0.7,0.7,1.0for file in files:img = itk.ReadImage(path + file) # 读取niifilename, fileexp = os.path.splitext(file) # get filenameoriginal_spacing = img.GetSpacing() # get spacingoriginal_size = img.GetSize() # get sizenew_size = [int(np.round(original_size[0] * original_spacing[0] / newspacing[0])),int(np.round(original_size[1] * original_spacing[1] / newspacing[1])),int(np.round(original_size[2] * original_spacing[2] / newspacing[2])),] # 新sizeresample = itk.ResampleImageFilter()resample.SetOutputDirection(img.GetDirection())resample.SetOutputOrigin(img.GetOrigin())resample.SetSize(new_size)resample.SetOutputSpacing(newspacing)if "segmentation" in file: #for seg and img have different waysresample.SetInterpolator(itk.sitkNearestNeighbor) #for seg,最临近插值,int8,否则0和1标记会直接插出0.5resample.SetOutputPixelType(itk.sitkUInt8)else:resample.SetInterpolator(itk.sitkLinear)resample.SetOutputPixelType(itk.sitkFloat32) #for img线性插值,float32,img = resample.Execute(img)itk.WriteImage(img, r"H:/LITS/segmentation_processing/" + filename + ".nii") # save and new filespath = r"H:/LITS/segmentation/" # volume文件所在路径
files = os.listdir(path) # 获取文件
nii(files)
接下来做本地化处理和导入网络预训练
6/12记录:今天接到了师兄的新任务,因为层厚太大了,所以想把多余的层截掉,然后再进行重采样,另外归一化也要想个办法实现,先记下来,明天去实现一下。(另外需要各向异性处理一下,一些spacing z太大的用最临近算法,比2.1小的用线性插值,原因是读图像的时候seg和vol的显示不流畅)
记录:d1、d2
6/13 各向异性处理
import numpy as np
import SimpleITK as itk
import osdef nii(files, newspacing=[0.7, 0.7, 1.0]): # 设定新spacing为0.7,0.7,1.0for file in files:img = itk.ReadImage(path + file) # 读取nii,记得要path+i才能够批量读取filename, fileexp = os.path.splitext(file) # get filenameoriginal_spacing = img.GetSpacing() # get spacingoriginal_size = img.GetSize() # get sizenew_size = [int(np.round(original_size[0] * original_spacing[0] / newspacing[0])),int(np.round(original_size[1] * original_spacing[1] / newspacing[1])),int(np.round(original_size[2] * original_spacing[2] / newspacing[2])),] # 新sizeresample = itk.ResampleImageFilter()resample.SetOutputDirection(img.GetDirection())resample.SetOutputOrigin(img.GetOrigin())resample.SetSize(new_size)resample.SetOutputSpacing(newspacing)#for seg and img have different waysresample.SetInterpolator(itk.sitkNearestNeighbor) #for seg,最临近插值,int8,否则0和1标记会直接插出0.5resample.SetOutputPixelType(itk.sitkUInt8)# if original_spacing[2]>0.7*3 : #for volume,>2.1最临近,<2.1线性# resample.SetInterpolator(itk.sitkNearestNeighbor)# resample.SetOutputPixelType(itk.sitkFloat32) #for img线性插值,float32,# else:# resample.SetInterpolator(itk.sitkLinear)# resample.SetOutputPixelType(itk.sitkFloat32)img = resample.Execute(img)itk.WriteImage(img, "H:/MedicinePublicData/LITS2017/seg_pro/" + filename + ".nii") # save and new filespath = "H:/MedicinePublicData/LITS2017/LITS2017/segmentation/" # volume文件所在路径
files = os.listdir(path) # 获取文件
nii(files)
修改了一下想法,觉得还是先重采样再crop比较好。crop是根据mask的位置上下裁的,这样数据比较小,训练方便。
之前没有做过,所以拿两个数据读入一下,看看能不能读到z轴的上下限
import os
import SimpleITK as itk
import numpy as npdef getsize(segfiles):for i in (segfiles):seg = itk.ReadImage(path2 + i) # read segseg_size = seg.GetSize() # get seg sizeprint(seg_size)seg_a=itk.GetArrayFromImage(seg)mask_index = np.argwhere(seg_a!= 0) # return mask!=0 whole coords(d1,h1,w1),(d2,h2,w2)=np.max(mask_index,0),np.min(mask_index,0)d_max=d1d_min=d2print(d_max)print(d_min)# def crop(volfiles,segfiles):
# for i,j in (volfiles,segfiles):
# vol=itk.ReadImage(path1+i) #read vol
#
# filename1,fileexp1=os.path.split(i) #get filename
# filename2,fileexp2=os.path.split(j)
# vol_size=vol.GetSize() #get vol size
# seg_size=seg.GetSize() #get seg size
#
# print(vol_size)
# print(seg_size)
#
# # mask_index=np.argwhere(seg!=0) #return mask!=0 whole coords
# # (d1,h1,w1),(d2,h2,w2)=np.max(mask_index,0),np.min(mask_index,0)path1='H:/test/vol/'
path2='H:/test/label/' #get segmentation
volfiles=os.listdir(path1)
segfiles=os.listdir(path2)
# crop(volfiles,segfiles)
getsize(segfiles)
可以读入,下一步是打算分别读图像和seg裁剪
存档今天的代码,报错了,明天继续改
import os
import SimpleITK as itk
import numpy as npdef getsize(segfiles,volfiles):for i,j in zip(segfiles,volfiles):seg = itk.ReadImage(path2 + i) # read segvol=itk.ReadImage(path1+j)filename1, fileexp1 = os.path.split(i) # get filenamefilename2,fileexp2=os.path.split(j)seg_size = seg.GetSize() # get seg sizevol_size=vol.GetSize()print(seg_size)print(vol_size)seg_a=itk.GetArrayFromImage(seg)mask_index = np.argwhere(seg_a!= 0) # return mask!=0 whole coords(d1,h1,w1),(d2,h2,w2)=np.max(mask_index,0),np.min(mask_index,0)d_max=d1 +3d_min=d2 -3newvol=vol[d_min:d_max,:,:]newseg=seg[d_min:d_max,:,:]itk.WriteImage(vol,'H:/test/voltest/'+filename1+'.nii')# def crop(volfiles,segfiles):
# for i,j in (volfiles,segfiles):
# vol=itk.ReadImage(path1+i) #read vol
#
# filename1,fileexp1=os.path.split(i) #get filename
# filename2,fileexp2=os.path.split(j)
# vol_size=vol.GetSize() #get vol size
# seg_size=seg.GetSize() #get seg size
#
# print(vol_size)
# print(seg_size)
#
# # mask_index=np.argwhere(seg!=0) #return mask!=0 whole coords
# # (d1,h1,w1),(d2,h2,w2)=np.max(mask_index,0),np.min(mask_index,0)path1='D:/test1/'
path2='H:/test/label/' #get segmentation
volfiles=os.listdir(path1)
segfiles=os.listdir(path2)
# crop(volfiles,segfiles)
getsize(segfiles,volfiles)
6/17解决了报错的问题:取名字的函数写错了,晕
源代码不见了,拿隔壁的数据集的crop代码来,大概lits是要替换成z轴即可,crop也crop z 轴
import os
import SimpleITK as itk
import numpy as npdef crop(segfiles,volfiles):for i,j in zip(segfiles,volfiles):seg = itk.ReadImage(path2 + i) # read segvol=itk.ReadImage(path1+j) #read volfilename1, fileexp1 = os.path.splitext(i) # get filename:filename1:segfilename2,fileexp2=os.path.splitext(j) #filename2:volseg_size = seg.GetSize() # get seg sizevol_size=vol.GetSize() #get vol size# print(seg_size)# print(vol_size)seg_a=itk.GetArrayFromImage(seg)mask_index = np.argwhere(seg_a!= 0) # return mask!=0 whole coords(d1,h1,w1),(d2,h2,w2)=np.max(mask_index,0),np.min(mask_index,0) #zyxh_max=h1 +3 #sideh_min=h2 -3newvol=vol[:,h_min:h_max,:] #new vol,对于3D图像可以这样直接CROP xyznewseg=seg[:,h_min:h_max,:] #new segitk.WriteImage(newvol,'H:/MedicinePublicData/Task02_Heart/imgtrain_cropy/'+filename2+'.nii') #save volitk.WriteImage(newseg, 'H:/MedicinePublicData/Task02_Heart/label_cropy/' + filename1 + '.nii') #save seg# def crop(volfiles,segfiles):
# for i,j in (volfiles,segfiles):
# vol=itk.ReadImage(path1+i) #read vol
#
# filename1,fileexp1=os.path.split(i) #get filename
# filename2,fileexp2=os.path.split(j)
# vol_size=vol.GetSize() #get vol size
# seg_size=seg.GetSize() #get seg size
#
# print(vol_size)
# print(seg_size)
#
# # mask_index=np.argwhere(seg!=0) #return mask!=0 whole coords
# # (d1,h1,w1),(d2,h2,w2)=np.max(mask_index,0),np.min(mask_index,0)path1='H:/MedicinePublicData/Task02_Heart/imgtrain_pro/' #get vol
path2='H:/MedicinePublicData/Task02_Heart/label_pro/' #get segmentation
volfiles=os.listdir(path1)
segfiles=os.listdir(path2)
# crop(volfiles,segfiles)
crop(segfiles,volfiles)
LITS数据集预处理(二)相关推荐
- (论文加源码)基于DEAP和MABHOB数据集的二分类脑电情绪识别(pytorch深度神经网络(DNN)和卷积神经网络(CNN))代码解析
论文解析见个人主页: https://blog.csdn.net/qq_45874683/article/details/130000469?csdn_share_tail=%7B%22type%22 ...
- (论文加源码)基于DEAP和MABHOB数据集的二分类脑电情绪识别(pytorch深度神经网络(DNN)和卷积神经网络(CNN))
该论文发表于2021年的顶级期刊.(pytorch框架) 代码解析部分在个人主页: https://blog.csdn.net/qq_45874683/article/details/13000797 ...
- 毕业设计一深度学习之MRI数据集预处理(合并,裁剪以及重命名等操作)
目录 一,MRI简介 二,MRI数据集获取 三,MRI数据集预处理 四,实现用Keras来构建基于MRI的网络结构 一,MRI简介 核磁共振成像(英语:Nuclear Magnetic Resonan ...
- 【统计学习方法】线性可分支持向量机对鸢尾花(iris)数据集进行二分类
本文摘要 · 理论来源:[统计学习方法]第七章 SVM · 技术支持:pandas(读csv).numpy.sklearn.svm.svm思想.matplotlib.pyplot(绘图) · 代码目的 ...
- 【统计学习方法】感知机对鸢尾花(iris)数据集进行二分类
本文摘要 · 理论来源:[统计学习方法]第二章 感知机 · 技术支持:pandas(读csv).matplotlib(画图).numpy.sklearn.linear_model.Perceptron ...
- ML之catboost:基于自带Pool数据集实现二分类预测
ML之catboost:基于自带Pool数据集实现二分类预测 基于自带Pool数据集实现二分类预测 输出结果 Learning rate set to 0.5 0: learn: 0.9886498 ...
- DL之GD:利用LogisticGD算法(梯度下降)依次基于一次函数和二次函数分布的数据集实现二分类预测(超平面可视化)
DL之GD:利用LogisticGD算法(梯度下降)依次基于一次函数和二次函数分布的数据集实现二分类预测(超平面可视化) 目录 利用LogisticGD算法(梯度下降)依次基于一次函数和二次函数分布的 ...
- ML之xgboost:利用xgboost算法对breast_cancer数据集实现二分类预测并进行graphviz二叉树节点图可视化
ML之xgboost:利用xgboost算法对breast_cancer数据集实现二分类预测并进行graphviz二叉树节点图可视化 目录 实现结果 实现代码 实现结果
- ML之RFXGBoost:基于RF/XGBoost(均+5f-CrVa)算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)
ML之RF&XGBoost:基于RF/XGBoost(均+5f-CrVa)算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还) 目录 输出结果 比赛结果 设计思路 核心代码 ...
最新文章
- springboot启动原理分析
- 在 Java 项目中打印错误日志的正确姿势,排查问题更方便,非常实用!
- 爬虫 spider09——爬取指定数据,去重复,并存储到mysql
- webpack项目搭建
- markdown 图片居中_Markdown入门指南【我为什么要推荐你学习Markdown?】
- Linux下samba服务搭建
- Java项目 学生信息管理系统 DAO设计模式
- ADO.NET五大对象详解(转)
- php接收url的json,api-php中url接收的json数据,json_decode为空
- 计算机语言元素周期表,元素周期表高清大图
- 科罗拉多州立大学计算机科学,科罗拉多州立大学
- 从苏宁电器到卡巴斯基第22篇:单证这一年(下)
- 生命密码:你的第一本基因科普书
- Windows与USB的通信
- 在linux下 wget 下载报错 http request sent,awaiting response... 404 not found
- 查看mysql数据库连接数、并发数相关信息
- html可以有多个h1,HTML5大纲和多个H1 SEO
- Nginx 的安装配置
- linux内核的gpiolib
- python处理期货数据_获取和讯期货数据(Python版本)