基于统计的窗口化操作,根据图像的统计信息,例如图像均值作为窗口中心,正负2.5(这个值并非固定)的方差作为窗口宽度
sitk.NormalizeImageFilter()通过将其均值设置为零并将方差设置为 1 来标准化图像。
sitk.StatisticsImageFilter()计算 Image 的最小值、最大值、方差和平均值。
sitk.IntensityWindowingImageFilter()将线性变换应用于用户定义的间隔内的输入图像的强度级别。 低于此间隔的值被映射到一个常数。 区间内的值被映射到另一个常量。
class StatisticalNormalization(object):
"""
Normalize an image by mapping intensity with intensity distribution
"""
def __init__(self, sigma, pre_norm=False):
self.name = 'StatisticalNormalization'
assert isinstance(sigma, float)
self.sigma = sigma
self.pre_norm=pre_norm
def __call__(self, sample):
image, label = sample['image'], sample['label']
for image_channel in range(len(image)):
if self.pre_norm:
normalFilter= sitk.NormalizeImageFilter()
image[image_channel] = normalFilter.Execute(image[image_channel])
statisticsFilter = sitk.StatisticsImageFilter()
statisticsFilter.Execute(image[image_channel])
intensityWindowingFilter = sitk.IntensityWindowingImageFilter()
intensityWindowingFilter.SetOutputMaximum(255)
intensityWindowingFilter.SetOutputMinimum(0)
intensityWindowingFilter.SetWindowMaximum(statisticsFilter.GetMean()+self.sigma*statisticsFilter.GetSigma());
intensityWindowingFilter.SetWindowMinimum(statisticsFilter.GetMean()-self.sigma*statisticsFilter.GetSigma());
image[image_channel] = intensityWindowingFilter.Execute(image[image_channel])
return {'image': image, 'label': label}