医学图像领域,数据往往有多种格式读取,这里提供一些自己常用的几个代码块
dimcom2nii
import dicom2nifti
if __name__ == '__main__':
dicom_path = "dicom/DICOM/"
dicom2nifti.convert_directory(dicom_path, './data/nii/')
nii2img
# nii文件另存为png图片
import numpy as np
import os # 遍历文件夹
import nibabel as nib # nii格式一般都会用到这个包
import imageio # 转换成图像
from sklearn import preprocessing
from PIL import Image
np.set_printoptions(threshold=np.inf)
def nii_to_image(niifile):
return 0
filepath = './data/nii/' # 读取本代码同个文件夹下所有的nii格式的文件
filenames = os.listdir(filepath)
imgfile = './data/img/'
slice_trans = []
for f in filenames: # 开始读取nii文件
s = f[-7:]
# 取出来是nii
print(s)
if s != '.nii.gz':
continue
s1 = f[:-7]
print(s1)
imgfile_path = imgfile + s1
print("imgfile_path:" + imgfile_path)
img_path = os.path.join(filepath, f)
# ./data/nii/18.nii
# print(img_path)
img = nib.load(img_path) # 读取nii
#print("img: ", img)
img_fdata = img.get_fdata()
fname = f.replace('.nii', '') # 去掉nii的后缀名
img_f_path = os.path.join(imgfile, fname)
if not os.path.exists(img_f_path):
os.makedirs(img_f_path)
# 创建nii对应的图像的文件夹
# # if not os.path.exists(img_f_path):
# os.mkdir(img_f_path) #新建文件夹
# #开始转换为图像
if '.gz' in s1:
(x, y, z) = img.shape[:3]
print("img2:")
print(img.shape)
else:
(x, y, z) = img.shape[:3]
print("img3:")
print(img.shape)
for i in range(z): # z是图像的序列 #遇到bug就修改一下
silce = img_fdata[:, :, i] # 选择哪个方向的切片都可以
#min_max_scaler = preprocessing.MinMaxScaler()
#slice_MinMax = min_max_scaler.fit_transform(silce)
imageio.imwrite(os.path.join(img_f_path, '{}_mask.png'.format(i)), silce)
img = Image.open(os.path.join(img_f_path, '{}_mask.png'.format(i)))
img.save(os.path.join(img_f_path, '{}_mask.png'.format(i)))
img2nii
"""
用于将文件夹的灰度图合成为一个numpy格式的
"""
import cv2
import os
import numpy as np
import medpy.io as mio
import torch
result='./201/gray_heatmap/'
filename= os.listdir(result)
list =[]
for i in range(0,192):
print(i)
img = cv2.imread(result + str(i) + '_mask.png',0)
# print(result + str(i) + '_mask.png')
list.append(img)
# print(list)
cmbtest, h = mio.load('201/cmb0.nii.gz')
list=torch.tensor(list)
list= list.permute(1,2,0)
list = np.array(list, dtype=np.float32)
mio.save(list,'mask.nii.gz' , hdr=h)
print('done!')
nii以及nii.gz可以通过代码直接读写,也可以通过现有的软件进行读取。
这里给出一种读取nii的方式
import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pylab as plt
import nibabel as nib
from nibabel import nifti1
from nibabel.viewers import OrthoSlicer3D
#example_filename = 'sub-101_space-T2S_desc-masked_T2S.nii.gz'
example_filename = "sub-305_space-T2S_T2S.nii.gz"
img = nib.load(example_filename)
print(img)
print(img.header['db_name']) # 输出头信息
# 由文件本身维度确定,可能是3维,也可能是4维
width, height, queue = img.dataobj.shape
OrthoSlicer3D(img.dataobj).show()
num = 1
for i in range(0, queue, 10):
img_arr = img.dataobj[:, :, i]
plt.subplot(5, 4, num)
plt.imshow(img_arr, cmap='gray')
num += 1
plt.show()