zoukankan      html  css  js  c++  java
  • mha格式的CT体数据转为jpg切片

    mha格式的CT体数据转为jpg切片

    mha格式

    .mha文件是一种体数据的存储格式,由一个描述数据的头和数据组成,一般我们拿到的原始医学影像的数据是.dcm也就是dicom文件,dicom文件很复杂包含了各种各样的标签,通常我们只关心dicom里的影像信息,所以一般会把多个dicom切片转成一个文件,例如.mha .mhd文件,这些文件里只包含简单的描述信息和体数据信息,便于处理。.mha的文件的样子如下图

    mha文件

    上半部分是关于数据的介绍,例如数据的维数,体素的真实的大小,数据的存储的类型等,下面的XXX等,就是数据部分了,ElementType就解释了下面的数据是一个一个Short类型的数,一共51251258个Short类型的数。
    .mhd文件和.mha文件类型,不过.mha文件一般分为.mhd文件和.raw文件,相当于.mha文件的两部分,一部分是描述信息,一部分是纯数据文件。

    窗宽窗宽

    一般CT值在-1000~+1000范围内,有2000多个级别,而一般显示器能显示出256个级别(灰度图0-255),所以不能展现出所有信息(就算可以,人眼也分辨不了),所以需要定一个范围,例如在以40为中心,400为宽度的范围内,展示图像信息,即-160~240之间的CT值要显示出来,低于-160都算作-160,高于240的都算作240,即把-160~240映射到0~255,这样设置不同窗位和窗宽就能展示不同组织的信息(不同组织的CT值不同)。

    将.mha转换成jpg切片

    下面将利用opencv和simpleitk,将.mha文件转为一组jpg文件。

    import SimpleITK as sitk
    import numpy as np
    import cv2
    import os
    
    def mha2jpg(mhaPath,outFolder,windowsCenter,windowsSize):
        
        """
        The function can output a group of jpg files by a specified mha file.
        Args:
            mhaPath:mha file path.
            outfolder:The folder that the jpg files are saved.
            windowsCenter:the CT windows center.
            windowsSize:the CT windows size.
        Return:void
    
        """
        image = sitk.ReadImage(mhaPath)
        img_data = sitk.GetArrayFromImage(image)
        channel = img_data.shape[0]
    
        if not os.path.exists(outFolder):
            os.makedirs(outFolder)
    
    
        low = windowsCenter-windowsSize/2
        high = windowsCenter+windowsSize/2
    
        for s in range(channel):
            slicer = img_data[s,:,:]
            slicer[slicer<low] = low
            slicer[slicer>high] = high
            slicer = slicer-low
            img = cv2.normalize(slicer, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
            cv2.imwrite(os.path.join(outFolder,str(s)+'.jpg'),img)
    
    def main():
        mha = input("Enter the mha path:")
        out = input("Enter the out folder:")
        wc = int(input("Enter the windows center:"))
        ws = int(input("Enter the windows size:"))
        mha2jpg(mha,out,wc,ws)
    
    
    
    if __name__ == "__main__":
        main()
    

    结果

    这里随机选取了两张张转换后的切片,分别选择不同窗宽的窗位,可以得到下图

    窗宽窗位1 窗宽窗位1

    计划

    博主正在学习医学影像处理相关方面的技能和知识,新开了一个git,会把觉得有用的可复用的代码丢进去,刚刚起步,目前还比较空
    https://github.com/MangoWAY/medicalImageScriptDemo

  • 相关阅读:
    经典网络复现(0)多层感知机和lenet
    将自有数据集下yolov训练结果(*.weights) 在进行部署
    DL基础学习计划
    自有数据集上使用keras训练YOLOv3目标检测
    《基于深度学习的图像语义分割方法综述》阅读理解
    Hessian矩阵以及在血管增强中的应用—OpenCV实现
    QML官方例子Calculator初步解析
    human_pose_estimation_demo的再进一步研究(基于OpenPOSE)
    10年图像处理工程师学习图像处理的小结
    human_pose_estimation_demo的进一步研究(基于OpenPOSE)
  • 原文地址:https://www.cnblogs.com/WAoyu/p/11819344.html
Copyright © 2011-2022 走看看