目录

一,MRI简介

二,MRI数据集获取

三,MRI数据集预处理

四,实现用Keras来构建基于MRI的网络结构


一,MRI简介

核磁共振成像(英语:Nuclear Magnetic Resonance Imaging,简称NMRI),又称自旋成像(英语:spin imaging),也称磁共振成像Magnetic Resonance Imaging,简称MRI),台湾又称磁振造影,香港又称磁力共振扫描,是利用核磁共振(nuclear magnetic resonance,简称NMR)原理,依据所释放的能量在物质内部不同结构环境中不同的衰减,通过外加梯度磁场检测所发射出的电磁波,即可得知构成这一物体原子核的位置和种类,据此可以绘制成物体内部的结构图像。

具体关于MRI影像更多方面的介绍,可以查看维基百科上面的具体介绍:核磁共振影像MRI

二,MRI数据集获取

方法一:

MRI数据集的获取可以从网络公开数据库ADNI上获取,但是需要进行注册账号,并申请下载,且周期比较长,所以想要获得该数据集的伙伴可以提前注册该账号,并进行下载。具体方法百度即可。

方法二:

我免费分享自己下载的MRI数据集,链接:https://pan.baidu.com/s/1EvYmJGuMA3HHetTMEJvJxw密码:71f9

三,MRI数据集预处理(主要部分)

1,介绍:

MRI数据集的获取得的原始MRI数据集分为Image和Label两部分,分别对各自进行预处理操作。即标签的合并及重命名(原始数据中的Label部分分为左脑R和右脑L,分别是标记的脑部左右海马体,需要将其进行合并成同一个数据并进行第一次整体重命名)、数据的裁剪、数据增广等操作。得的原始MRI数据集分为Image和Label两部分,分别对各自进行预处理操作。即标签的合并及重命名(原始数据中的Label部分分为左脑R和右脑L,分别是标记的脑部左右海马体,需要将其进行合并成同一个数据并进行第一次整体重命名)、数据的裁剪、数据增广等操作。

2,如图所示:

3,预处理代码(Python实现)

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# author:HuaCode
# datetime:19-3-28 下午6:31
# software: PyCharmimport numpy as np
import os
import nibabel as nib
import shutil#该模块用于拷贝文件path_label = "./test/label/"#原始label目录
path_img = "./test/image/"#原始image目录
label_path = "./test/combine_label/"#合并标签目录
target_path = "./test/rename_image/"#重命名image目录
target_img_path = "./test/data_croped/image/"#裁剪后的image保存目录
target_label_path = "./test/data_croped/label/"#裁剪后的label保存目录
croped_img_path = "./test/data/image/"#裁剪后并重命名的image目录
croped_label_path = "./test/data/label/"#裁剪后并重命名的label目录#将标签文件的左脑和右脑进行合并,并保存
def Combine_Label():if not os.path.exists(label_path):os.mkdir(label_path)list = os.listdir(path_label)#os.listdir()方法用于返回指定的文件夹包含的文件或文件夹的名字的列表,这个列表以字母顺序,它不包括'.'和'..',即使它在文件夹中#print(list)list.sort()#list.sort()用于对列表进行排序,如果指定参数,则使用比较函数指定的比较函数#print(list)#因为前面用list.srot(),所以列表中的文件名会按照从小到大的顺序并按照LR的顺序来依次间隔排列#这里的合并原理是:先找到左脑L,赋值给file_L,然后跳出本次循环,再找下一个右脑R,找到之后,再次赋值给file_R,然后通过路径加载该文件,并得到数据部分file_L = ""n1 = 0n2 = 0for file in list:#从列表中获得单个图像的名字#print(file)if file[:file.rfind("_")] not in file_L:#temp_file用于存储左边文件名,并用于后面load调用。file_L = file#当文件为左边的文件时,将文件名赋值给file_Lcontinueelse:file_R = file#当文件名为右边的文件时,将文件名赋值给file_R#加载右脑标签rimg = nib.load(path_label + file_R)#加载标签#print rimgn1 = n1 + 1print"加载第" + str(n1) + "个右脑标签"img_R = rimg.get_data()  # 获取数据部分#print img_R.dtype# 加载左脑标签limg = nib.load(path_label + file_L)  # 加载标签n2 = n2 + 1print"加载第" + str(n2) + "个左脑标签"img_L = limg.get_data()  # 获取数据部分# 两个标签进行合并combine_img = img_R + img_L * 2combine_img.astype(np.int32)nib.save(nib.Nifti1Image(combine_img, rimg.affine), label_path + file[:file.rfind("_")] + ".nii")print "合并完成!"#将源文件按照对应的标签来进行命名,使标签文件和对应的源文件的名称相同
def Rename_Image():if not os.path.exists(target_path):os.mkdir(target_path)list = os.listdir(path_img)#获得源文件的名称list.sort()#将源文件的名称进行排序,默认按照升序规则排序label_list = os.listdir(label_path)label_list.sort()#将标签名称进行排序combine_list = zip(list, label_list)#将源文件名和标签名打包成一个元组,并以列表的形式返回for (img_name, label_name) in combine_list:#解析每一个元组中的源文件名称和标签名称,从而进行对应重命名if label_name[:label_name.rfind("_")] in img_name:#如果发现标签名称存在该源文件名称中,则进行拷贝名称#shutil.copyfile(file1,file2)将文件2中的内容用文件1中的内容覆盖,新文件的名称为file2shutil.copyfile(path_img+img_name, target_path+label_name)#将img_name中的内容覆盖到重新以label_name命名的新文件中,这就是修改名称后的源文件print "done" + img_nameprint "the first rename well!"#将源文件和标签文件裁剪为(64,64,96)大小后保存
def Croped():wrong_list = ["002_S_0938","007_S_1304","016_S_4121","029_S_4279","136_S_0429"]if not os.path.exists(target_img_path):os.makedirs(target_img_path)#递归的建立输入的路径,即使是上层的路径不存在,它也会建立这个路径if not os.path.exists(target_label_path):os.makedirs(target_label_path)img_list = os.listdir(target_path)#获得重命名标签的源文件for i, img in enumerate(img_list):#将源文件名称组合成一个索引序列,同时列出名称和对应的下标,一般用在for循环中timg = nib.load(target_path + img)#加载源文件image = timg.get_data()#获取源文件的数据部分image = image.transpose(2,1,0)#原始数组为三维数组(x,y,z),则原始axis排列为(0,1,2),则transpose()的默认参数为(2,1,0),# 得到转置后的数组视图,不影响原数组的内容以及大小,这里实际上是x轴和z轴进行了交换image = image[::-1,::-1,:]#进行了一个左右翻转tlabel = nib.load(label_path + img)#加载标签文件label = tlabel.get_data()#获取标签的数据部分label = label.transpose(2,1,0)label = label[::-1,::-1,:]#此时的label为uint8类型的,需要转换为bool类型再进行操作bool_label = label.astype(np.bool)#将label转换成bool类型img_shape = label.shape#获得文件的大小axis_list = np.where(bool_label)#输出满足条件(即非0)元素的坐标,这里的坐标以元组的形式给出,原数组有三维,所以tuple中有三个数组#print axis_list#输出元组,元组中有三个数组,数组用arry数组存储center_x = (axis_list[0].max() + axis_list[0].min()) / 2#获得x轴的中间值#print center_xcenter_y = (axis_list[1].max() + axis_list[1].min()) / 2#获得y轴的中间值#print center_ycenter_z = (axis_list[2].max() + axis_list[2].min()) / 2#获得z轴的中间值#print center_zcenterpoint = [np.array(center_x, np.int32), np.array(center_y, np.int32), np.array(center_z, np.int32)]#用列表来存储三个arry数组,arry数组中有两个参数第一个为x轴的坐标,第二个参数为数据类型dtype#print centerpointlabel_block = label[centerpoint[0] - 32:centerpoint[0] + 32, centerpoint[1] - 32:centerpoint[1] + 32,centerpoint[2] - 48:centerpoint[2] + 48]#将标签文件裁剪为(64,64,96)大小#print label_block.shapeimage_block = image[centerpoint[0]-32:centerpoint[0]+32,centerpoint[1]-32:centerpoint[1]+32,centerpoint[2]-48:centerpoint[2]+48]#将源文件裁剪为(64,64,96)大小#print image_block.shapeblock_sum = np.sum(label_block.astype(np.bool))#裁剪后标签中的label中bool值为真的像素个数#print "block_sum"#print block_sumall_sum = np.sum(bool_label)#裁剪前标签中的label中bool值为真的像素个数#print "all_sum"#print all_sumif img[img.find("_") + 1:img.rfind("_")] not in wrong_list:if block_sum == all_sum:print img + str(" croped")nib.save(nib.Nifti1Image(image_block, timg.affine), target_img_path+img)nib.save(nib.Nifti1Image(label_block, tlabel.affine), target_label_path+img)else:print "bad croped********************"print "all croped!"def Rename_All_Image():if not os.path.exists(croped_img_path):os.makedirs(croped_img_path)if not os.path.exists(croped_label_path):os.makedirs(croped_label_path)list_img = os.listdir(target_img_path)list_label = os.listdir(target_label_path)list_img.sort()list_label.sort()combine_list = zip(list_img, list_label)#将源文件和标签文件打包成一个元组,并以列表的形式返回for i, (img, label) in enumerate(combine_list):#将源文件名称组合成一个索引序列,同时列出名称和对应的下标,一般用在forif label == img:print str(i) + img + labelimage = nib.load(target_img_path + img).get_data()label = nib.load(target_label_path + label).get_data()nib.save(nib.Nifti1Image(image, np.eye(4)), croped_img_path + str(i) + ".nii")nib.save(nib.Nifti1Image(label, np.eye(4)), croped_label_path + str(i) + ".nii")print str(i) + "rename well"else:print "bad rename**************************"print "label:" + labelprint "img:" + imgprint "all rename well!"def Verify_Image():if not os.path.exists(target_path):os.makedirs(target_path)if not os.path.exists(target_img_path):os.makedirs(target_img_path)data = os.listdir(target_path)croped_data = os.listdir(target_img_path)data.sort()croped_data.sort()combine_list = zip(data, croped_data)for data1,data2 in combine_list:data = nib.load(target_path + data1).get_data()croped_data = nib.load(target_img_path + data2).get_data()center_x = (data.shape[0]) / 2center_y = (data.shape[1]) / 2center_z = (data.shape[2]) / 2centerpoint = [np.array(center_x, np.int32), np.array(center_y, np.int32), np.array(center_z, np.int32)]block_data = data[centerpoint[0] - 32:centerpoint[0] + 32, centerpoint[1] - 32:centerpoint[1] + 32,centerpoint[2] - 48:centerpoint[2] + 48]assert(np.any(block_data.shape == croped_data.shape))print "asserted successfully!"if __name__ == '__main__':Combine_Label();#合并Rename_Image()#重命名Croped()#裁剪Rename_All_Image()#再次重命名Verify_Image()#验证

四,实现用Keras来构建基于MRI的网络结构

基于MRI网络的构建,这个目前我正在进行,后续会更新基于U-net,Densenet以及二者融合的改版网络结构以及训练的模型,敬请期待……

PS:毕业设计,多多关照!有需要交流的,留下QQ:404125822,可以一起交流^_^

毕业设计一深度学习之MRI数据集预处理(合并,裁剪以及重命名等操作)相关推荐

  1. 转载【数据集】计算机视觉,深度学习,数据挖掘数据集整理

    金融 美国劳工部统计局官方发布数据 上证A股日线数据,1999.12.09 至 2016.06.08,前复权,1095支股票 深证A股日线数据,1999.12.09 至 2016.06.08,前复权, ...

  2. 【深度学习】图像数据集处理常用方法合集(部分基于pytorch)

    [深度学习]图像数据集处理常用方法合集(部分基于pytorch) 1 图像数据集预处理的目的1.1 灰度图转化1.2 高斯滤波去除高斯噪声 2 使用双峰法进行图像二值化处理2.1 图像直方图2.2 双 ...

  3. 【神经网络与深度学习】CIFAR10数据集介绍,并使用卷积神经网络训练图像分类模型——[附完整训练代码]

    [神经网络与深度学习]CIFAR-10数据集介绍,并使用卷积神经网络训练模型--[附完整代码] 一.CIFAR-10数据集介绍 1.1 CIFAR-10数据集的内容 1.2 CIFAR-10数据集的结 ...

  4. 深度学习常用的数据集,包括各种数据跟图像数据。

    1.   免费数据集下载(持续更新中...) 2.[导读] "大数据时代",数据为王!无论是数据挖掘还是目前大热的深度学习领域都离不开"大数据".大公司们一般会 ...

  5. 数据集大全:25个深度学习的开放数据集

    介绍 深度学习的关键是训练.无论是从图像处理到语音识别,每个问题都有其独特的细微差别和方法. 但是,你可以从哪里获得这些数据?现在你看到的很多研究论文都使用专有数据集,而这些数据集通常不会向公众发布. ...

  6. 二十五个深度学习相关公开数据集

    转 [干货]二十五个深度学习相关公开数据集 2018年04月18日 13:42:53 阅读数:758 (选自Analytics Vidhya:作者:Pranav Dar:磐石编译) 目录 介绍 图像处 ...

  7. 25个用于深度学习的开放数据集

    25个用于深度学习的开放数据集每个数据科学家必须使用 PRANAV DAR, 2018年3月29日 转载自:https://www.analyticsvidhya.com/blog/2018/03/c ...

  8. 【深度学习】-Imdb数据集情感分析之模型对比(4)- CNN-LSTM 集成模型

    [深度学习]-Imdb数据集情感分析之模型对比(4)- CNN-LSTM 集成模型 前言 [深度学习]-Imdb数据集情感分析之模型对比(3)- CNN [深度学习]-Imdb数据集情感分析之模型对比 ...

  9. 【深度学习】-Imdb数据集情感分析之模型对比(2)- LSTM

    [深度学习]-Imdb数据集情感分析之模型对比(2)-LSTM 文章目录 前言 一.LSTM是什么? 算法介绍 二.训练LSTM模型 1.数据预处理 2.构建LSTM模型 设定模型参数 构建并训练模型 ...

最新文章

  1. python c 混合编程 用c循环_混合编程:用 C 语言来扩展 Python 大法吧!
  2. ElasticSearch的搜索推荐(typeahead)
  3. Java并发编程之线程安全性
  4. API函数的调用过程
  5. java html转word的坑 poi样式丢失还乱码
  6. 服务机器人研究报告:产业链分析及投资前景预测
  7. 小米5s plus 刷机 国际版
  8. 5G 与 MEC 边缘计算
  9. 小白在线要饭系统源码
  10. 什么是 Ubuntu?
  11. 华为OD机试真题Java_2022-2023-题目0188-网上商城优惠活动(一)
  12. 苹果刷机未知错误75_被抢先体验的苹果iOS14 系统坑惨的用户,到底遇到了多少bug ,怎么降级系统...
  13. 秒表 程序_使用在线秒表作为桌面应用程序
  14. java限定符_Java-泛型限定符、通配符
  15. 教资面试计算机硬件真题,2019上半年教师资格证面试真题:高中信息技术
  16. latex文章投稿小tips
  17. 3dsmax模型和导入模型到unity3d 设置
  18. Esri美国个人许可购买指南
  19. 西安电子科技大学专业英语考试总结
  20. 视频格式转换实用手册

热门文章

  1. SQL server用户
  2. Java-PDF添加水印【文字或图片】,使用Spire.PDF for Java
  3. Leetcode338. 比特位计数
  4. C语言 atoi 函数解析
  5. 欧姆龙CPIE TXD和RXD指令串口调试
  6. Origin如何画小提琴图
  7. R语言T检验与Z检验
  8. linux网卡启停,Linux程序启停脚本
  9. ORB-SLAM2的源码阅读(十一):LoopClosing类
  10. PHP解密微信手机号数据