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

分割结果如下图所示,白质灰质都出来,但是脑脊液并不如原图像的明显:

Python 读取二进制流转为图片 python 读取二进制图像数据_Python 读取二进制流转为图片


原图像显示结果:

Python 读取二进制流转为图片 python 读取二进制图像数据_二进制文件_02

分析:有可能处理方式不正确,导致脑脊液信息丢掉,但是查看矩阵里的元素时发现是存在1的,那就有可能是显示方式不对,后续再试试调整到0~3的归一化范围再查看一下。

时发现是存在1的,那就有可能是显示方式不对,后续再试试调整到0~3的归一化范围再查看一下。(updated:2019/11/4)

Python 读取二进制流转为图片 python 读取二进制图像数据_二进制文件_03

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);

Python 读取二进制流转为图片 python 读取二进制图像数据_二进制文件_04


很可惜,从右边标注的范围看出,确实图片的值只有0 1 2而没有3;通过length(find(img==3))的查询矩阵结果看,与原图像相比,训练结果只有9个值是隶属于3的类别,而原图像结果有354k个,暂时未能好好解决这个训练结果有偏差的问题(updated:2019/11/7)

Python 读取二进制流转为图片 python 读取二进制图像数据_归一化_05