CT-Windowing医学CT图像增强

摘要

CT winding 是CT扫描的一项图像处理任务,它有助于突出关键的组织结构,通过修改 HU (Hounsfield Units) 参数,使图像更易于分析。

Hounsfield Unit (HU)

亨氏量表(Hounsfield scale)阻射率的数量尺度单位,命名自X射线电脑断层扫描的发明人高弗雷·豪斯费尔德(Godfrey Newbold Hounsfield)。亨氏单位常用于X射线电脑断层扫描,因此又称为CT值(CT number)。

HU 值与组织的组成和性质有关,因此代表各种组织的密度,HU 值越高,材料越致密,反之亦然。

以下为各组织在 HU 量表上的一些值

Window Width & Window Level

Window Width (WW)

是 CT 图像包含的 HU 值范围的度量,任何低于 WW 下限值的 HU 值将在扫描中显示为黑色,而高于 WW 上限值的 HU 值将显示为白色。

随着 WW 的增加,将需要更大的密度变化来改变代表某个 HU 单位的灰色阴影。这会导致对比度损失,因为随着 HU 值的增加,更多的结构将看起来相似(尽管具有不同的密度)。

随着 WW 的减小,较小的密度变化将导致 CT 图像上的颜色发生变化,导致密度接近的结构将分配给不同的灰度,这将增加对比度。

Window Level (WL)

表示窗口中心或中点的 HU 值,为图像设置的 WL 越低,整个图像将变得越亮。

随着 WL 的降低,较低的 HU 值就能将组织表示为白色,这将允许更多的白色通过,从而使图像更亮。因此,WL 影响图像的亮度。

WW & WL 计算

灰度上限:WL + (WW / 2)
灰度下限:WL - (WW / 2)

WW & WL 示例

在 CT 图像查看软件中,通常有各种标准 WL 和 WW。

TissueWWWL
骨头2000500
1600-600
40040
7030
软组织35050
16060
纵隔膜(胸腔)50050
中风(低密度脑成像)3030
血管成像600170

WW & WL 选择

一、根据所需部位的 HU 值(对于CT图像而言)分布范围选取,若是增强 CT 的话 HU 值会有一些差别,可以观察直方图,自定义 WW 和 WL

1
2
3
4
5
6
7
8
9
10
11
12
def transform_ctdata(self, windowWidth, windowLevel, normal=False):
"""
注意,这个函数的self.image一定得是float类型的,否则就无效!
return: trucated image according to window level and window width
"""
minWindow = float(windowLevel) - 0.5*float(windowWidth)
newimg = (self.image - minWindow) / float(windowWidth)
newimg[newimg < 0] = 0
newimg[newimg > 1] = 1
if not normal:
newimg = (newimg * 255).astype('uint8')
return newimg

二、根据图像的统计信息,例如图像均值作为窗口中心,$\pm \delta$ 的方差作为 WW

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
import SimpleITK as sitk
import torchvision as tv

class StatisticalNormalization(object):
"""
Normalize an image by mapping intensity with intensity distribution
"""

def __init__(self, sigma):
self.name = 'StatisticalNormalization'
assert isinstance(sigma, float)
self.sigma = sigma

def __call__(self, sample):
image, label = sample['image'], sample['label']
statisticsFilter = sitk.StatisticsImageFilter()
statisticsFilter.Execute(image)

intensityWindowingFilter = v.IntensityWindowingImageFilter()
intensityWindowingFilter.SetOutputMaximum(255)
intensityWindowingFilter.SetOutputMinimum(0)
intensityWindowingFilter.SetWindowMaximum(
statisticsFilter.GetMean() + self.sigma * statisticsFilter.GetSigma())
intensityWindowingFilter.SetWindowMinimum(
statisticsFilter.GetMean() - self.sigma * statisticsFilter.GetSigma())

image = intensityWindowingFilter.Execute(image)

return {'image': image, 'label': label}
- ETX   Thank you for reading -
  • Copyright: All posts on this blog except otherwise stated, All adopt CC BY-NC-ND 4.0 license agreement. Please indicate the source of reprint!