医学影像数据格式转换(.mha转.jpg)

文章目录

  • 医学影像数据格式转换(.mha转.jpg)
    • 1. BRAST2015数据集介绍
    • 2. 格式转换
    • 3. 结果展示

医学影像数据格式转换(.mha转.jpg)

1. BRAST2015数据集介绍

医学影像数据格式转换(.mha转.jpg)_第1张图片
医学影像数据格式转换(.mha转.jpg)_第2张图片
​ BRAST2015的数据集格式如上图所示,由5个.mha文件构成。其中Flair,T2,T1c,T2为四种模态(理解为四种提取特征的方式),OT为GroundTruth也就是掩码(0,1,2,3,4五种标签)。

2. 格式转换

​ 在进行图像分割的过程中,数据集最基本的格式为图片+掩码(图片作为数据,掩码作为真值)。故在处理医学影像时需要将.mha文件转换为.jpg文件。针对该数据集直接附代码。

#数据处理部分,将mah格式转化为jpg和mask_jpg


import SimpleITK as sitk
from SimpleITK.SimpleITK import Image


from tqdm import tqdm
from PIL import Image
import numpy as np
import cv2
import os
import matplotlib.pyplot as plt
import glob


def mha2jpg(mhaPath,outFolder,out_Mask):
    
    mha_names = os.listdir(mhaPath)
    for file_name in tqdm(mha_names):
        img_names = os.listdir(mhaPath + file_name)
        for img_name in img_names:
            image = sitk.ReadImage(mhaPath + file_name + '/' + img_name)

            img_data = sitk.GetArrayFromImage(image)
            #测试图片形状以及像素极值
            #print(img_data.shape, img_name, np.max(img_data), np.min(img_data))
            name = img_name.split('.O.')[-1].split('.')[0]
            max_num, min_num = np.max(img_data), np.min(img_data)
            channel = img_data.shape[0]

            #进行归一化操作,*255将其再次可视化
            img_data = (img_data - min_num) / (max_num - min_num) * 255
            for s in range(channel):
                #提取每一张特征图
                slicer = img_data[s,:,:].astype(np.uint8)
                #array返回Image
                slicer = Image.fromarray(slicer)
                slicer = slicer.resize((512,384))

                if name == 'OT' or name == 'VSD':
                    slicer.save(os.path.join(out_Mask,file_name + name + '_Flair_' + str(s) + '.jpg'))
                    slicer.save(os.path.join(out_Mask,file_name + name + '_T1_' + str(s) + '.jpg'))
                    slicer.save(os.path.join(out_Mask,file_name + name + '_T1c_' + str(s) + '.jpg'))
                    slicer.save(os.path.join(out_Mask,file_name + name + '_T2_' + str(s) + '.jpg'))
                if name != 'OT' and name != 'VSD':
                    slicer.save(os.path.join(outFolder,file_name + name + str(s) + '.jpg'))


if __name__ == '__main__':
    mha = './BRATS2015/training/HGG/'
    out = './data/train/image/'
    out_m = './data/train/mask/'
    mha2jpg(mha,out,out_m)
    

其中主要的代码如下:

    mha_names = os.listdir(mhaPath)
    for file_name in tqdm(mha_names):
        img_names = os.listdir(mhaPath + file_name)
        for img_name in img_names:
            image = sitk.ReadImage(mhaPath + file_name + '/' + img_name)

            img_data = sitk.GetArrayFromImage(image)
            #测试图片形状以及像素极值
            #print(img_data.shape, img_name, np.max(img_data), np.min(img_data))
            name = img_name.split('.O.')[-1].split('.')[0]
            max_num, min_num = np.max(img_data), np.min(img_data)
            channel = img_data.shape[0]

            #进行归一化操作,*255将其再次可视化
            img_data = (img_data - min_num) / (max_num - min_num) * 255
            for s in range(channel):
                #提取每一张特征图
                slicer = img_data[s,:,:].astype(np.uint8)
                #array转换Image
                slicer = Image.fromarray(slicer)
                slicer = slicer.resize((512,384))

​ .mha文件通过sitk.ReadImage函数进行图片的读取,再通过sitk.GetArrayFromImage对图片转化为array格式,通过img_data = (img_data - min_num) / (max_num - min_num) * 255进行归一化操作,最后再将array转化为Image.
医学影像数据格式转换(.mha转.jpg)_第3张图片
输出图片形状,图片文件名,图片像素极大极小值。输出这三者很重要,会更清楚整个数据集的状况,图片形状中155说明一个.mha文件会生成155张特征图做为我们最后的数据集,(240,240)有助于之后输入网络结构后图片形状的resize;图片文件名有利于Image数据集的构建;像素极值有利于进行归一化。(注:这里归一化操作建议自己写,不要用函数直接进行。函数操作将浮点部分的像素直接整型化,导致一定的特征丢失。)

3. 结果展示

Image数据:
医学影像数据格式转换(.mha转.jpg)_第4张图片
Mask数据:
医学影像数据格式转换(.mha转.jpg)_第5张图片

你可能感兴趣的:(python,深度学习,机器学习,计算机视觉,tensorflow)