mha格式的CT体数据转为jpg切片
mha格式的ct体数据转为jpg切片
mha格式
.mha文件是一种体数据的存储格式,由一个描述数据的头和数据组成,一般我们拿到的原始医学影像的数据是.dcm也就是dicom文件,dicom文件很复杂包含了各种各样的标签,通常我们只关心dicom里的影像信息,所以一般会把多个dicom切片转成一个文件,例如.mha .mhd文件,这些文件里只包含简单的描述信息和体数据信息,便于处理。.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()
结果
这里随机选取了两张张转换后的切片,分别选择不同窗宽的窗位,可以得到下图
计划
博主正在学习医学影像处理相关方面的技能和知识,新开了一个git,会把觉得有用的可复用的代码丢进去,刚刚起步,目前还比较空
https://github.com/mangoway/medicalimagescriptdemo
上一篇: 推荐一款酷炫闪烁的告警按钮
下一篇: PHP编程20大效率要点