本文主要是介绍使用python批量读取mhd格式和raw格式医学图像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我的数据存放大致如下所示
E:/105casesMask_Seg是总的数据文件夹,Cxxx文件夹存放的是每个病人mhd文件,文件名字就相当于后面的patient_name
#导入需要的包
import os
from PIL import Image
import SimpleITK as sitk
import matplotlib.pyplot as plt
from natsort import natsorted
from tqdm import tqdm#获取文件内的的子文件夹名称
def get_file_name(filename):for root, dirs, files in os.walk(filename):array = dirsif array:return array
#创建空目录
def make_dir(save_path):if not os.path.isdir(save_path):os.makedirs(save_path)#将一个病人的所有图片整合在一张图打印出来
def plot_ct_scan(scan, num_column=4, jump=1):num_slices = len(scan)num_row = (num_slices//jump + num_column - 1) // num_columnf, plots = plt.subplots(num_row, num_column, figsize=(num_column*5, num_row*5))for i in range(0, num_row*num_column):plot = plots[i % num_column] if num_row == 1 else plots[i // num_column, i % num_column] plot.axis('off')if i < num_slices//jump:plot.imshow(scan[i*jump], cmap=plt.cm.bone) #读取图片并保存
def save_img(data_path,save_path):root = os.path.join(os.getcwd(),data_path)paths = os.listdir(root)print(paths)for path in paths:if path.find('mhd')>=0:data =sitk.ReadImage(os.path.join(root,path)) #读取mhd文件#print(data)spacing = data.GetSpacing()scan = sitk.GetArrayFromImage(data)print('scan.shape',scan.shape) #图像大小print('spacing: ', spacing) #间隔print('# slice: ', len(scan)) #切片数量#plot_ct_scan(scan)make_dir(save_path)for i in range(scan.shape[0]):im = Image.fromarray(scan[i,:,:]) #这里就是提取的图片数据 im.save(save_path+'/'+str(i)+'.png') #保存图片if __name__ == '__main__':data_dir = 'E:/105casesMask_Seg/' #mhd数据存放位置result_dir = 'E:/labels/' #读取的图片存放位置patients_name = get_file_name( data_dir )patients_name = natsorted(patients_name )#print(data_dir)for patient_name in tqdm(patients_name): #分别保存每个病人数据data_path = data_dir + patient_namesave_path = result_dir + patient_namemake_dir(save_path)save_img(data_path,save_path)
这篇关于使用python批量读取mhd格式和raw格式医学图像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!