本文由Markdown语法编辑器编辑完成.
1. 背景:
近日在工作中,突然收到现场运营的反馈,一个医生从信息科老师导出的检查,上传到我们的服务器后,经过AI的预测后,结果是黑屏。
而这个检查对应的患者,是医院一个很有名的专家,第二天要做泌尿外科手术的患者。专家需要提前通过我们的软件,辅助做手术规划之类的工作安排。现场运营立刻联系研发,能不能赶紧支持解决一下。
我一听,慌了神。专家,急着手术,迫不及待,十万火急 !!!
问同事拿到这个有问题的检查数据后,开始仔细地分析开来。
首先这个数据,在我们产品的界面中,是无法展示的, 也就是黑屏。
但是这里的黑屏,并不是图像不存在。其实图像是存在的,只不过按照我们预设的窗宽窗位,它显示出来是黑屏。但是,通过切换不同的窗宽窗位的预设,比如从胸腹窗,切换到肺窗以后,是可以看到图像的轮廓的,但是图像整体上仍然是偏暗的。
其次,当我将这个序列生成的体数据,放到slicer里面时,slicer是可以显示出来这个序列的,而且看起来还比较“正常”。
至少,在肉眼看起来,看不太明显它有什么问题。
但是,如果从slicer的volumes模块查看,却可以发现这个序列影像,不太正常的地方。
切换到Volumes模块后,可以看到这个序列影像,它的Scalar Range的范围是: -1024 ~ -769.
这里的Scalar Range, 其实就是CT值。
CT值,指的就是这个影像上面,像素点的灰度值,经过计算后得到的值,
关于CT值的概念,可以通过咨询kimi助手了解到,它主要就是反映人体内组织的密度。密度越小,CT值越小;反之,则CT值越大。由于肺部里面,主要是充满着很多的空气,因此,如果是包含胸肺的序列,它的影像的最小值,一般是-1024(空气的CT值);而由于胸肺区域,还有肋骨,所以它的影像的最大值,一般是1000+以上(骨骼的CT值)。
但是这个有问题的序列,它的CT的最大值,才-769,显然是不符合常理的。
2. 分析
2.1 为什么slicer可以正常展示序列?
那么,为什么这个有问题的序列,在slicer里面,能够正常展示呢?
其实,之所以这个有问题的序列,在我们的软件产品中黑屏,而在slicer, 或其他的一些dicom viewer里面能够正常展示。是因为,这些软件,它们会根据这个序列的灰度范围,而自动调节显示时使用的窗宽窗位。而我们的软件,由于是给特定部位使用的,所以里面有一个默认的窗宽窗位,就像第一幅图中展示的, ww = 150, wl = 90.
而slicer在加载这个序列后,它的窗宽窗位,会自适应地调整成为: ww = 254, wl = -897.
2.2 这个灰度范围是怎么计算出来的?
那么到底,这个序列的灰度范围: -1024 ~ -769, 是怎么计算出来的呢?
这就需要查看一下这个dcm的tag, 主要涉及到:
Tag Name | Tag Value |
---|---|
BitsAllocated | 8 |
BitsStored | 8 |
High Bit | 7 |
Pixel Representation | 0 |
Rescale Intercept | -1024 |
Rescale Slope | 1 |
PixelData->pixel_array | 0 ~ 255 |
其实,为什么PixelData的灰度值的范围是 0 ~ 255呢?
因为这个dicom里面,它的BitsAllocated是8, 也就是每个像素点的灰度值,是由一个8位的二进制数决定的。而一个8位的二进制,它的最大值,就是256.
那么再通过 RescaleIntercept的调整,自然它的CT值的范围就变成了: (0 ~ 255) - 1024 = (-1024 ~ -769).
因此,这个影像的灰度范围,永远都是256个灰阶单位。
那么,如果想让这个序列,能够在我们的软件中显示,该怎么办呢? —— 只能通过扩大它的灰阶,才能实现。
也就好比,我需要在原来256个灰阶的基础上,放大10倍,变成2560个灰阶。而且,需要保持最小的灰阶,仍然是-1024。
那么,这样的灰阶放大,有意义吗?
仔细想想,其实是没有太大意义的。
为什么会有不同的灰阶呢?因为,灰度代表每个点的密度。为什么正常的序列,灰阶会跨越那么大呢。因为,人体内不同组织,它们的密度差异很大。从最小的-1024, 到比较大的2000 ~ 3000。正因为灰阶跨度范围大,我们才能够通过调整窗宽窗位,看到某一个局部部位的细节。细节,其实就是通过不同的灰阶变化来实现的。
由于人的眼睛,对于灰度的范围,识别区域其实很小。比如平时看到的jpg, png, 它的灰度范围就是 0 ~ 255。但是,由于医学诊断要求的精度更高,所以对于医学影像,一般医院都会有专门的医用影像显示器,才能呈现出更加精细的灰度差异。
那么,如果我们要把一个 256灰阶的图像,扩大10倍的灰阶。比较简单的线性变化,就是每个像素点的灰度值,乘以10。经过这样的处理,灰度范围是变大了,但是其实无法达到将丢失的细节,还原回来的目的。那么,即使增大灰度范围后,在后续的处理过程中,也可能会出现各种各样的问题。
因此,我也就放弃了,再将这个问题图像,想办法复原的方法了。
后来的解决方法是,我们找到有经验的同事,从PACS上直接下来下来这个序列,然后再次处理,就可以正常展示了。
也就是说,最后问题,还是需要从下载图像的源头解决。
如果本身下载下来的图像,就是缺失了很多灰度和细节信息的,那么通过后续的弥补,是很难真正还原的。