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