.mha文件是一種體數據的存儲格式,由一個描述數據的頭和數據組成,通常咱們拿到的原始醫學影像的數據是.dcm也就是dicom文件,dicom文件很複雜包含了各類各樣的標籤,一般咱們只關心dicom裏的影像信息,因此通常會把多個dicom切片轉成一個文件,例如.mha .mhd文件,這些文件裏只包含簡單的描述信息和體數據信息,便於處理。.mha的文件的樣子以下圖python
上半部分是關於數據的介紹,例如數據的維數,體素的真實的大小,數據的存儲的類型等,下面的XXX等,就是數據部分了,ElementType就解釋了下面的數據是一個一個Short類型的數,一共51251258個Short類型的數。
.mhd文件和.mha文件類型,不過.mha文件通常分爲.mhd文件和.raw文件,至關於.mha文件的兩部分,一部分是描述信息,一部分是純數據文件。git
通常CT值在-1000~+1000範圍內,有2000多個級別,而通常顯示器能顯示出256個級別(灰度圖0-255),因此不能展示出全部信息(就算能夠,人眼也分辨不了),因此須要定一個範圍,例如在以40爲中心,400爲寬度的範圍內,展現圖像信息,即-160~240之間的CT值要顯示出來,低於-160都算做-160,高於240的都算做240,即把-160~240映射到0~255,這樣設置不一樣窗位和窗寬就能展現不一樣組織的信息(不一樣組織的CT值不一樣)。github
下面將利用opencv和simpleitk,將.mha文件轉爲一組jpg文件。windows
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/medicalImageScriptDemocode