使用ITK对医学图像序列进行重采样,主要用到以下几个类:
(1)itk.LinearInterpolateImageFunction
(2)itk.ScaleTransform
(3)itk.resample_image_filter
(1)itk.LinearInterpolateImageFunction
这个类是用来实现线性插值采样的功能。需要注意的是这个类的用法与一般的类对象的初始化不同,初始化该类的方法如下所示:
interpolator = itk.LinearInterpolateImageFunction.New(dcm_reader)
# dcm_reader 是 itk.imread() 读入的DICOM序列图像
(2)itk.ScaleTransform
这个类应该是用于实现缩放变换的功能。重采样会对原来的序列的体素大小进行改变,因此图像缩放可以降低因重采样而导致的图像失真的问题。这个类的初始化也与其他的类的初始化不同,其初始化的形式如下所示:
Dimension = dcm_reader.GetImageDimension()
scale_transform = itk.ScaleTransform[itk.D, Dimension].New()
scale_transform_center = [float(int(s / 2)) for s in inputsize]
scale_transform.SetCenter(scale_transform_center)
中间这个itk.D
不太清楚是干什么用的,但是这个是不能省略的,大哥们知道的帮忙补充一下…
Dimension
这个变量是来说明这要重采样的图像的维数,scale_transform_center
为设置的缩放中心。以原图像的中心进行缩放能够更好地还原原图像的边缘细节。scale_transform.SetCenter(center)
是设置缩放操作的缩放中心。
(3)itk.resample_image_filter
这个类则是用于实现重采样的滤波器。在设定重采样的参数后,通过这个类可以实现对原图像的重采样,具体实现如下:
resample = itk.resample_image_filter(
dcm_reader,
transform=scale_transform,
size=outsize,
out_spacing=outputspacing,
output_origin=output_origin
)
参数transform, size, out_spacing, output_origin
分别为转换参数、输出尺寸、输出体素大小、输出图像的方向。
Python中使用ITK实现重采样的代码如下:
import itk
dcm_reader = itk.imread(dcm_directory)
inputspacing = itk.spacing(dcm_reader)
output_origin = itk.origin(dcm_reader)
inputsize = itk.size(dcm_reader)
outputspacing = (1, 1, 1)
outsize = [ int(inputsize[0] * inputspacing[0] / outputspacing[0]),
int(inputsize[1] * inputspacing[1] / outputspacing[1]),
int(inputsize[2] * inputspacing[2] / outputspacing[2])]
interpolator = itk.LinearInterpolateImageFunction.New(dcm_reader)
Dimension = dcm_reader.GetImageDimension()
scale_transform = itk.ScaleTransform[itk.D, Dimension].New()
scale_transform_parameters = scale_transform.GetParameters()
scale_transform_center = [float(int(s / 2)) for s in inputsize]
scale_transform.SetCenter(scale_transform_center)
resample = itk.resample_image_filter(
dcm_reader,
transform=scale_transform,
size=outsize,
output_spacing=outputspacing,
output_origin=output_origin
)