本文内容、图片与涉及的源码均为作者原创,未经许可不得转载。版权声明或联系作者请移步 “关于”
继续借助计算机的威力玩转医学影像,今天博文的内容主要是对DWI成像原理的理解,展示如何在脱离磁共振主机或工作站的情况下,甚至是在家用笔记本电脑上自己动手写代码来合成ADC图,并利用传统的图像处理方法对DWI高信号和ADC图的低像素值区域进行分割和识别。
DWI 与 ADC
DWI即扩散加权成像,目前大部分厂家都采用GRASE+EPI序列来进行采集,这个序列其实早在1960年代就被发明出来,直到70年代末才在临床应用,同时,为了减少伪影和提高对比度,采用放射状方式填充K空间。DWI是在180度重聚焦脉冲或梯度切换的前后各附加一个大小相等、方向相反的扩散敏感梯度,示意图如下:
静止的水分子也就是扩散受到限制的水分子,在方向相反的两个梯度作用下,因为位置没有改变所以并不会出现失相位的情形,信号也不会丢失;而自由扩散的水分子在两次扩散梯度场实施期间位置发生变化,引起失相位,从而导致信号丢失,因此相对而言,扩散受到限制的水分子信号就高于自由扩散的水分子,这个情形有点像相位对比法MRA,如下图所示:
在A时刻,自由扩散的水分子和扩散受限的水分子都有着各自的相位,而经过了180度相位重聚焦和双极梯度场的作用,扩散受限的水分子在C处仍然回到初始的相位,自由扩散的水分子因为位置移动已经失去原先的相位,即与原先相位不同,导致信号丢失。
这两个方向相反的双极扩散敏感梯度场,实际上会在至少三个方向上去施加,即人体的x,y,z轴,这样就会对这三个方向上的水分子的扩散都敏感,目前高端机型应该至少会有6个方向,而DTI会有至少20个方向。扩散权重由这两个双极梯度场的梯度范围来决定,即b值,b值越大对扩散越敏感。
我们以三个方向为例,通常DWI图像按照以下步骤生成:
1、DWI序列首先会在扩散敏感梯度场关闭或者b值非常低的情况下采集一组T2加权的b0或b50图像(b=50经常用于腹部检查,以减少静脉高信号即T2权重的影响,以下将b0和b值非常低的加权像统称为b0像),作为后续计算的基准图。
2、然后打开扩散敏感梯度场,按照设定的b值分别生成三个方向的DWI源图。
3、对三幅DWI源图进行叠加和平均,得到一副合并的图像,即是我们和临床看到的扩散加权图像,又名Trace DWI图,Trace DWI图像具有相当大的T2加权。
4、对b0和Trace DWI两个图像进行对数运算,计算出ADC图,以剔除T2效应,这就为什么只有在DWI呈高信号而ADC图下呈低信号的病灶才更有实际意义。
自己动手重建ADC图
有了b0图像和DWI图像,就算没有在主机或工作站上重建出ADC图,我们仍然可以自己动手利用下面的公式生成ADC图:
对b0图和DWI图的逐个像素进行以自然对数为底的函数运算,得到一副新的图像,这个图像就是ADC图。注意前一个函数,是以b值为常数,ADC为自变量的指数函数,这就是为什么我们把传统的扩散加权成像也称作单指数模型,多指数模型不仅对细胞内外水分子扩散敏感,还对微循环的血液灌注敏感,这就是近几年的DWI新技术 - IVIM,即体素内不相干运动扩散成像。以 GE MR750w 的DWI图像为例来合成 ADC 图,部分代码如下:
1
2
3
4
5
6
7
8
9# 读取 DWI 数据
dwi1 = pydicom.read_file('/00060054.dcm') # b0
dwi2 = pydicom.read_file('/00060034.dcm') # b1000
# 遍历 b0 和 b1000 的 DWI 图像的像素,按照前述公式将两者逐像素进行对数运算
ConstPixelDims = (int(dwi2.Rows), int(dwi2.Columns), 1)
for i in range(ConstPixelDims[0]):
for j in range(ConstPixelDims[1]):
ADC[i, j] = log(dwi2_pixel_array[i, j]/dwi1_pixel_array[i, j])/-1000
病灶在ADC图上显示为低信号这件事,会让非医学影像专业的小伙伴们感到蒙圈,那有没有办法让病灶在ADC图上也显示为高信号呢?当然可以,这就是EADC-指数ADC,指数ADC的图像是对b0和b1000的图像经指数函数变换得到的:
1
2
3for i in range(ConstPixelDims[0]):
for j in range(ConstPixelDims[1]):
EADC[i, j] = dwi2_pixel_array[i, j]/dwi1_pixel_array[i, j]
OK,尽管EADC图的背景没有黑化,但我们秉着磁共振图像上哪白哪亮哪就可能有问题的大原则,仍可以简单粗暴+一目了然的发现图像中的异常了!
在对图像进行处理时,顺便窥探了下GE 3T和飞利浦1.5T图像文件的差别,发现两者采集矩阵以及图像分辨率几乎完全一样,1.5T的图像位深是12位,实际使用11位,而3T是16位,实际使用15位,其实普通人眼对于灰度差异的识别能力只有4位,即16个灰阶,极少数人的灰阶识别范围能达到256个灰阶,即8位,两者差别不仅来源于采集方法、线圈信噪比(线圈类型与通道数)和后处理方法上,可能还跟主磁场均匀性和环境电磁噪声的干扰,甚至屏蔽效果如何等方面有关,但从临床应用上看1.5T不会在分辨率上与3T有十分明显的差距,以下是两个设备生产的图像文件的部分内在差别:
哪些疾病会导致ADC值降低
DWI高信号+ADC值降低必定代表水分子在组织中的扩散受限,那究竟哪些疾病会导致组织中的水分子扩散受限呢?一是细胞毒性水肿,二是细胞密集度增加,三是液体的粘稠度增高,譬如:
病灶的自动分割和识别
对DWI和ADC我们已经有了物理和医学方面的基础,并利用函数变换重建出ADC图和EADC图,接下来再借助计算机进行自动化处理。对于磁共振序列的识别我们已经在前一篇博文中有了详细阐述,那个模型借助深度学习算法实现人工智能,且经反复测试已经很健壮,对其稍加改动就能够识别出扩散加权图像的b0图像和b1000图像,正确率约97%,模型源码已经公开在了我的github主页上,有条件和兴趣的小伙伴们可以下载和实验,地址为 https://github.com/douruixin/HeadMRSerialsRecognition
本文所述的分割和识别采用阈值法,不需要借力深度学习算法,因此技术含量有限,但看上去却比较唬人!其实只要按照传统的数字图像处理的套路走就可以,即设定阈值、对比度增强、二值化、降噪与滤波,最后分割及识别。细说起来,其实每个过程又都很复杂,在这里不做过多解释了,有兴趣的小伙伴们可以看看数字图像处理方面的书。分割和识别的部分代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35# 判断设备,根据设备设定阈值,因为图像位数不同,分割的阈值也会不同
manufacturer = dwi1.Manufacturer.upper()
index = manufacturer.find("PHILIPS")
if index != -1:
ret, thresh = cv2.threshold(dwi2.pixel_array, 130, 500, cv2.THRESH_BINARY) # Philips
else:
ret, thresh = cv2.threshold(dwi2.pixel_array, 800, 1500, cv2.THRESH_BINARY) # GE
img = np.uint8(thresh)
# 降噪处理
kernel = np.ones((3, 3), np.uint8)
opening_thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
# 按照给定阈值找到病灶,将其坐标点保存在contours中,以便显示时将其轮廓标记为红色
mask = opening_thresh == 800
opening_thresh[mask] = 1
image = dwi1.pixel_array
img8 = cv2.convertScaleAbs(opening_thresh)
binary, contours, hierarchy = cv2.findContours(img8, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 显示处理后的图像
plt.figure()
plt.subplot(1, 4, 1)
plt.title('b1000')
pylab.imshow(dwi2.pixel_array, cmap=pylab.cm.gray)
plt.subplot(1, 4, 2)
plt.title('ADC')
pylab.imshow(ADC, vmin=-0.0001, vmax=0.004, cmap=pylab.cm.gray)
plt.subplot(1, 4, 3)
plt.title('Segment CI')
pylab.imshow(img, cmap=pylab.cm.gray)
plt.subplot(1, 4, 4)
plt.title('Identify CI')
pylab.imshow(ADC, vmin=-0.0001, vmax=0.004, cmap=pylab.cm.gray)
plt.plot(x[:len(contours[0])], y[:len(contours[0])], '-', color='red')
总结
综上所述,DWI的关键就是利用相位相反的两个扩散梯度场的叠加,导致组织中自由扩散的水分子失相位而成像。根据DWI和ADC图的变换公式,我们可以脱离磁共振主机或工作站在PACS甚至个人计算机上将ADC图重建出来。扩散加权序列在疾病筛查、诊断以及鉴别诊断中有着极其重要的作用,同时结合ADC图对于诊断水分子扩散受限的相关疾病越来越不可或缺。因此,快速和准确的对DWI和ADC图上的异常信号进行识别成为临床诊治路径中的重要环节。因个人能力有限,本文也仅仅是肤浅的对此加以阐述,希望借助自己的微薄之力能对同行的小伙伴们有所启发。