医学图像预处理之可视化

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)



医学图像预处理之可视化

 

 

 

 

 

 

上一篇:无需要太多,只需要一张Python词云图


下一篇:CF1278F - Cards (dp,概率)