1 前言
本文介绍两种医疗图像可视化的方案,一种是直接使用ITK-SNAP读取.nii.gz图像;另一种是使用python+SimpleITK将后缀名为.nii.gz转化成jgp的形式进行保存。虽然第二种方式即使用python+SimpleITK可以将医疗图像数据保存成JGP的形式,但是这种转化是有损失,所以如果你的目标是训练一个深度学习模型,我不建议采用这种方式。本文所使用的数据集为公开的胰腺分割数据集,其包含82个病人的胰腺数据集。
1.1 使用ITK-SNAP读取医疗图像
ITK-SNAP是一个用于三维医学图像分割的软件应用程序。它是宾夕法尼亚大学宾州图像计算与科学实验室(PICSL)的Paul Yushkevich博士和犹他大学科学计算与成像研究所(SCI)的Guido Gerig博士合作的产物,他的愿景是创造一个工具,将致力于一个特定的功能,分割,并将易于使用和学习。ITK-SNAP是免费的、开源的、多平台的,下载地址为http://www.itksnap.org/pmwiki/pmwiki.php?n=Downloads.SNAP3。ITK-SNAP加载数据集之后初始界面如下:初始化界面中三张图分别表示某一个slice所对应的横断面、矢状面、冠状面截图。横断面表示的是从上往下看时,患者组织的截图;矢状面表示从左往右看时,患者组织的截图;冠状面表示从前往后看时,患者组织的截图;如图3所示。我们可以发现直接观察图像时,各个组织对比不是很明显,此时可以通过调整窗宽、窗位来使得组织之间的差异性变大,具体操作如图2所示。
1.2 将医疗图像转化成jgp的形式
虽然可以使用python+SimpleITK将医疗图像数据保存成JGP的形式,但是如果你的目标是训练一个深度学习模型,我不建议采用这种方式。一个最主要的原因是在转化成JPG的时候,医疗图像中的每一个像素点都是有意义的,医生可以根据具体的像素值来判断患者是否患上某类疾病,但是在将医疗图像转化成JGP的时候,会对原始的像素值产生损失,一个详细的解释如下:将医疗图像转化成JGP的形式,可以分为以下几个步骤:1、读取数据,并使用GetArrayFromImage()获得对应像素值;2、将对应的像素值取值范围设置在(wc - ws / 2, wc + ws / 2)之间;3、将对应的像素值归一化到(0,255)之间,这个过程是有损失的。在本例中我们设置医疗图像的取值范围在(-110,190)之间,假设原始像素点为150,使用最大最小归一化之后改像素点的取值为0.1538即(190-150)/(150-110),0.1538这时几乎和原始数据一样,但是当转化成jpg时,结果需要乘以255取整时,便会产生损失,所以建议不要保存成JPG而是将归一化的数据,使用h5py保存成.h5的形式,从h5文件中读取数据。以下为将.nii.gz转化成jpg保存的代码与结果,具体过程如上所述,不再重复。
# -*- coding: utf-8 -*-
# @Time : 2020/12/30 15:22
# @Author : YYLin
# @Email : 854280599@qq.com
# @File : Visualization.py
# 读取mha文件,并将其转化成Image
import SimpleITK as sitk
import os, cv2
def mha2jpg(save_dir, mhaPath, wc=40, ws=300):
# 使用SimpleITK读取数据,并使用GetArrayFromImage()函数获得图像信息
image = sitk.ReadImage(mhaPath)
img_data = sitk.GetArrayFromImage(image)
channel = img_data.shape[0]
low = wc - ws / 2
high = wc + ws / 2
all_img = []
# 将医疗图像中的取值范围设置在(wc - ws / 2, wc + ws / 2)之间
# 然后归一化0-255之间并保存
for s in range(channel):
slicer = img_data[s, :, :]
slicer[slicer < low] = low
slicer[slicer > high] = high
img = cv2.normalize(slicer, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
cv2.imwrite(os.path.join(save_dir, str(s) + '.jpg'), img)
return all_img
save_dir = 'result'
if not os.path.exists(save_dir):
os.makedirs(save_dir)
gz_path = 'PANCREAS_0015.nii.gz'
new_img_nc = mha2jpg(save_dir, gz_path)