我尝试了以下代码,但输出绝对错误。
warp = sitk.WarpImageFilter()
warp.SetInterpolator(sitk.sitkLinear)
out = warp.Execute(reference_img, transform_img)
它完全给了我reference_img,但不是转换后的图像。
你有没有用过这个功能?你能帮我解决这个问题吗?
答案 0 :(得分:0)
与所有其他SimpleITK过滤器一样,WarpImageFilter在SimpleITK构建基础架构中经过严格测试。过滤器包装包括多个测试的描述,其中验证结果并验证跨语言的行为。此外,在SimpleITK中,所有过滤器都会自动测试几种行为的一致性,这些行为是通过SimpleITK的代码生成过程完成的。
ResampleImageFilter
现在是WarpImageFilter的首选方法。它应用任何变换来重新采样图像,其中DisplacementFieldTransform
包含位移场图像。这与仅占用置换字段的WarpImageFilter
不同。
“参考图像”似乎有些混乱。重采样和扭曲滤波器都需要知道图像的输出信息。这包括输出原点,输出大小,输出间隔和输出方向。这些可以单独手动设置或从“参考图像”设置。有ResampleImageFilter.SetRefenceImage()
和WarpImageFilter.SetOutputParametersFromImage
方法可以做同样的事情。参考图像是可选的。
使用SimpleITK测试数据的WarpImageFilter
的示例用法:
img = sitk.ReadImage("cthead1-Float.mha")
dis = sitk.ReadImage("cthead1-dis1.nrrd")
warper = sitk.WarpImageFilter()
warper.SetOutputParameteresFromImage(img)
out = warper.Execute(img,dis)
以下是使用ResampleImageFilter完成的相同操作。它需要将位移场图像转换为float64以与变换一起使用:
resampler = sitk.ResampleImageFilter()
resampler.SetReferenceImage(img)
dis_tx = sitk.DisplacementFieldTransform(sitk.Cast(dis,sitk.sitkVectorFloat64))
resampler.SetTransform(dis_tx)
out = resampler.Execute(img)