本文给出一种自己用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)