ITK配准框架⽰例及代码解析(Python)
ITK配准框架⽰例及代码解析(Python)
初学医学图像配准,把ITK⾥⾃带的配准⽰例看了⼏遍,由于没有注释,所以⾃⼰整理了⼀下。
⼀、配准⽅法
采⽤刚性变换的⽅法进⾏全局变换
使⽤基于均⽅差的准则来量化变换后图像之间的相似性
优化器选择使⽤梯度下降法来根据相似性测度中得到的经过量化的测度优化变换参数
⼆、配准步骤
1、定义待配准图像类型: 维数, 像素类型,并输⼊待配准的两幅图像,参考图 Fixed Image,浮动图 Moving Image;
2、定义图像转换类型,把参考图像空间映射到待配准图像空间,这⾥采⽤的是刚性变换;
3、定义优化器类型及设置优化参数,这⾥采⽤梯度下降法,设置初始振幅为
4、最⼩步长为0.001、松弛因⼦为0.
5、最⼤迭代次数为200;
4、相似性测度模块采⽤均⽅差的准则;
5、定义配准⽅法类型并实例化已经定义的相关类型;
6、初始化配准类型的参数,并将参数传递给配准过程;
7、相似度函数输⼊到优化模块中进⾏最优化计算得到最终变换参数,这个过程⼀般通过
迭代来实现,即重复2~4步直到取得最⼤值;
8、得到最优化后的各项参数并输出;
熏肉怎么熏9、通过最终得到的参数重采样待配准图像,得到配准结果;
10、⽐较配准前后和配准过程后的差异。并且输出最后的配准结果以及配准前后的差异结果。
配准过程是⼀个优化问题,配准过程每进⾏⼀次迭代,得到⼀测度值,将该测度值与
我们所设定的值进⾏⽐较,如果达到预期的效果则停⽌迭代,得到最终配准结果。当然,
迭代可能⽆限制进⾏,所以我们还需要设置⼀迭代上限。
三、配准结果
fixed image
moving image
output image
differenceImageBefore
differenceImageAfter
四、代码
import itk
fixedImageFile = 'D:/peizhunDATA/fixed.mhd'
移项的依据是什么movingImageFile = 'D:/peizhunDATA/moving.mhd'
outputImageFile = 'D:/peizhunDATA/output.png'
differenceImageAfterFile = 'D:/peizhunDATA/differenceImageAfter.png' differenceImageBeforeFile = 'D:/peizhunDATA/differenceImageBefore.png'
# 定义待配准图像类型: 维数, 像素类型:
PixelType = pe('float')
fixedImage = itk.imread(fixedImageFile, PixelType)
movingImage = itk.imread(movingImageFile, PixelType)
Dimension = fixedImage.GetImageDimension()
FixedImageType = itk.Image[PixelType, Dimension]
MovingImageType = itk.Image[PixelType, Dimension]
# 定义图像转换类型,把参考图像空间映射到待配准图像空间的转换:
TransformType = itk.TranslationTransform[itk.D, Dimension] # 转换类型:刚性(移动)变换initialTransform = TransformType.New()
# 定义优化器的类型及优化参数
optimizer = itk.RegularStepGradientDescentOptimizerv4.New( # 梯度下降法的⼀种
LearningRate=4, # 初始振幅
MinimumStepLength=0.001, # 最⼩步长
RelaxationFactor=0.5, # 松弛因⼦
NumberOfIterations=200) # 最⼤迭代次数(以防⽌⽆限次迭代)
# 定义相似性测度类型
metric = itk.MeanSquaresImageToImageMetricv4[ # 均⽅根距离
嫩蓝FixedImageType,
洗面奶排行榜男士
MovingImageType].New()
# 定义配准⽅法类型并实例化已经定义的相关类型
registration = itk.ImageRegistrationMethodv4.New(FixedImage=fixedImage,
MovingImage=movingImage,
Metric=metric,
Optimizer=optimizer,
InitialTransform=initialTransform)
"""
应该注意: 配准过程是⼀个优化的过程, 优化过程每迭代⼀次, 就与相似性测度进⾏⼀次⽐较,
当相似性测度值达到我们设定的预期值,或者达到设定的迭代上限时就停⽌迭代,得到最终结果.
"""
秋分手抄报
# 初始化配准类型的参数,并将参数传递给配准过程
movingInitialTransform = TransformType.New()
initialParameters = movingInitialTransform.GetParameters() # 得到浮动图像的初始变换参数
# ⽤于变换的参数队列由沿着每⼀维的⽅向的平移值构成。设置浮动图像初始变换参数值到零以便将变换初始成恒等变换。initialParameters[0] = 0 # 沿x⽅向的偏移值设置为0
initialParameters[1] = 0 # 沿y⽅向的偏移值设置为0
movingInitialTransform.SetParameters(initialParameters) # 将设置后的参数队列设为浮动图像新的初始变换参数registration.SetMovingInitialTransform(movingInitialTransform) # 设置完成后传递给配准过程
identityTransform = TransformType.New()
identityTransform.SetIdentity()
registration.SetFixedInitialTransform(identityTransform) # 将参考图像的初始变换参数传递给配准过程
registration.SetNumberOfLevels(1)
registration.SetSmoothingSigmasPerLevel([0])
registration.SetShrinkFactorsPerLevel([1])
# 更新配准,使每次迭代⽣效
registration.Update()
# 得到最后的X,Y⽅向的变换参数
三轮草
transform = registration.GetTransform()
finalParameters = transform.GetParameters()
translationAlongX = finalParameters.GetElement(0)
translationAlongY = finalParameters.GetElement(1)
# ⼀共迭代的次数
numberOfIterations = optimizer.GetCurrentIteration()
# 迭代完成后的相似性测度值
bestValue = optimizer.GetValue()
# 输出迭代完成后的各项参数
print("Result = ")
快乐的一天作文400字print(" Translation X = " + str(translationAlongX))
print(" Translation Y = " + str(translationAlongY))
print(" Iterations = " + str(numberOfIterations))
print(" Metric value = " + str(bestValue))
# 定义复合变换
CompositeTransformType = itk.CompositeTransform[itk.D, Dimension] outputCompositeTransform = CompositeTransformType.New() outputCompositeTransform.AddTransform(movingInitialTransform) outputCompositeTransform.AddTransform(registration.GetModifiableTransform())
# 设置重采样过滤器的相应参数
resampler = itk.ResampleImageFilter.New(Input=movingImage,
Transform=outputCompositeTransform,
UReferenceImage=True,
ReferenceImage=fixedImage)
resampler.SetDefaultPixelValue(100) # 设置默认灰度值,⽤来 "突出" 显⽰映射后在浮动图像之外的区域
# 定义输出图像和像素的类型
OutputPixelType = pe('unsigned char')
OutputImageType = itk.Image[OutputPixelType, Dimension]
# 重采样过滤器的输出
caster = itk.CastImageFilter[FixedImageType,
OutputImageType].New(Input=resampler)
# 输出配准后图像
writer = itk.ImageFileWriter.New(Input=caster, FileName=outputImageFile)
writer.SetFileName(outputImageFile)
匹诺曹故事writer.Update()
# 通过itk.SubtractImageFilter⽐较"经过变换的浮动图像"与"固定图像"之间的差异
difference = itk.SubtractImageFilter.New(Input1=fixedImage,
Input2=resampler)
# 由于两幅图像之间的差异可能对应⾮常⼩的亮度值,使⽤itk.RescaleIntensityImageFilter
# 重新调节亮度值,使其更加明显
intensityRescaler = itk.RescaleIntensityImageFilter[FixedImageType,
OutputImageType].New(
Input=difference,
OutputMinimum=itk.NumericTraits[OutputPixelType].min(),
OutputMaximum=itk.NumericTraits[OutputPixelType].max())
# 输出配准后的差异⽐较图
resampler.SetDefaultPixelValue(1)
writer.SetInput(intensityRescaler.GetOutput())
writer.SetFileName(differenceImageAfterFile)
writer.Update()
# 输出配准前的差异⽐较图
resampler.SetTransform(identityTransform)
writer.SetFileName(differenceImageBeforeFile)
writer.Update()