dcm|dicm是医学图像常见格式(IMA可看作dicm同类型的格式[1]),是直接能从机器上获得的图像格式,但是如果使用深度神经网络进行处理和其他操作需要对原始的图像格式进行处理才能够使用。
首先对于CT图像需要明确的是我们从机器上获得的是X ray穿过物体后投影在探测器上,探测器接收的数据是投影的数值(projection data-->sinogram(projection image) 这个过程也要进行数值转换,如取对数等操作).
dicm应该是对投影后数据前处理完毕进行重建后的图像,但是图像的像素值并不一定以Hu为单位(应该跟厂家有关,比如IMA是西门子CT设备产生的图像,不是HU单位),因此要查看dicm文件的文件头信息确认像素值的单位,如果不是HU需要处理[2]。
对于IMA文件第一步转换为HU格式,第二步进行调窗,第三步可根据情况缩放范围自行选择处理或者不处理送给神经网络或者其他操作。
(1)转换为HU格式:[3,4]中大致讲清楚了转换的方法,但是实现对于我想使用单张图像转换不太好用,因此参考代码有如下改动。
def getCtHU(dicm):
'''直接传入dicm文件/IMA文件'''
img=np.array(dicm.pixel_array).astype('int32')
img[img == -2000.0] = 0
Hu = np.array(img).astype('float64')
RescaleIntercept = dicm.RescaleIntercept
RescaleSlope = dicm.RescaleSlope
if RescaleSlope != 1:
Hu = Hu * RescaleSlope
Hu += RescaleIntercept
return Hu
(2)获得HU为单位的图像的矩阵后,需要针对HU图像进行调窗,以适应于我们对不同部位的图像进行分析(医学图像中不同部位的适用的HU范围不同,这个范围叫做窗口),在imageJ中窗口的大小叫做window,窗口的中心叫做level,在这几个参考的帖子中有不同的叫法,在此按照ImageJ 的名称[5,6]。
def windowsLevelTransform(Hu, window, level):
img = Hu
min = level - float(window) * 0.5;
max = level + float(window) * 0.5;
img[img < min] = min
img[img > max] = max
norm_ = (img - min) / window
norm_.astype('float32')
return norm_
调窗后的数据就是想要查看的数据范围了,在这里对不同部位调窗的数据值设定也不相同[7].
?
?reference
-
(21条消息) python如何打开.ima文件格式的医学影像(已爬坑,.IMA为西门子CT设备的另一种医学影像文件格式)_巨魔战将-CSDN博客_ima文件 - (21条消息) Dicom 图像--像素值(灰度值)转为CT值_小可爱的博客-CSDN博客_ct值转灰度值
- 成熟的医学影像“调窗”(window-leveling)算法详解 - 微笑的艾米 - 博客园 (cnblogs.com)Full Preprocessing Tutorial | Kaggle
- 处理医疗影像的Python利器:PyDicom - 知乎 (zhihu.com)
- (21条消息) 医学图像预处理(三)——windowing(ct对比增强)_normol的博客-CSDN博客_ct图像预处理
- CT的窗宽,窗位到底是什么意思? - 知乎 (zhihu.com)
- 图像识别 | 计算机断层扫描基础:加窗 - 知乎 (zhihu.com)
- (21条消息) 手把手教你用python实现机器学习预测疾病_程序员石磊-CSDN博客_机器学习 疾病预测
- 常见医疗扫描图像处理步骤 - 知乎 (zhihu.com)
|