本文给出一种自己用python和matlab处理小批量深度学习医学图像的步骤与思路;
首先本文用DenseNet+UNet的模型做脑组织分割,主要分割对象包括脑脊液、脑白质、脑灰质和背景,一共四类,训练完成进行测试,生成.bin二进制文件;
然后要对这个二进制文件进行处理:
import nibabel as nib import matplotlib as ptl import os import numpy as np import struct if __name__=='__main__': img="E:/BrainSegData/IBSR18/IBSR_01/IBSR_01_label.nii.gz" nii = nib.load(img) nii1 = nii.get_fdata()#我的数据是float64类型 nii2 = np.squeeze(nii1)#删除多余的维度 #上述代码目的是为了在IPython console查看原图像的尺寸,这里是256*128*256 #下述代码进行二进制文件的处理 RESpath='C:/Users/ending/Desktop/DL/result_image.bin' RESbinfile = open(RESpath, 'rb') RESpic = np.zeros((((256,128,256,4)))) #十分耗时的矩阵划分 for classes in range(4): for z in range(256): for y in range(128): for x in range(256): data = RESbinfile.read(4) elem= struct.unpack("f",data)[0] RESpic[x][y][z][classes]=elem RESimg=np.split(RESpic,4,axis=3)#对这个4维数组在第四维划分出4个矩阵 REStest=RESimg[0]#项目信息在该通道上,建议结合自己的需求再决定要哪个通道的信息 REStest1=np.squeeze(REStest) #矩阵由(256,128,256,1)变化到->(256,128,256) #nii的Header复制 affine = nii.affine.copy() hdr = nii.header.copy() #输出nii newnii=nib.Nifti1Image(REStest1,affine,hdr) nib.save(newnii,'C:/Users/ending/Desktop/DL/REStest1.nii.gz')分割结果如下图所示,白质灰质都出来,但是脑脊液并不如原图像的明显: 原图像显示结果:
分析:有可能处理方式不正确,导致脑脊液信息丢掉,但是查看矩阵里的元素时发现是存在1的,那就有可能是显示方式不对,后续再试试调整到0~3的归一化范围再查看一下。 时发现是存在1的,那就有可能是显示方式不对,后续再试试调整到0~3的归一化范围再查看一下。(updated:2019/11/4)
Matlab读取.bin文件要简单很多,这里给出代码与思路: fip=fopen(‘xxx.bin’); [data,count]=fread(fip,‘float’);%结合需求决定数据类型,不同的数据类型结果也不同 %此时所有数据都存在了data里 img=reshape(data,256,128,256);%按照需求划分矩阵形状 %取某一张切片: img142=img(:,:,142); %以pcolor函数绘制三维显示: xx=linspace(1:1:256); yy=linspace(1:1:128); [xt yt] = meshgrid(xx,yy); xt=xt’; yt=yt’; h=pcolor(xt,yt,img142); 很可惜,从右边标注的范围看出,确实图片的值只有0 1 2而没有3;通过length(find(img==3))的查询矩阵结果看,与原图像相比,训练结果只有9个值是隶属于3的类别,而原图像结果有354k个,暂时未能好好解决这个训练结果有偏差的问题(updated:2019/11/7)