从NumPy创建的ITK VectorImage无法实例化插值器求助
问题解决:ITK VectorImage 无法实例化插值器的处理方法
问题根源
你用itk.image_view_from_array(arr, is_vector=True)创建的是**itk.VectorImage类型(即itk.itkVectorImagePython.itkVectorImageF2),但报错里的支持类型都是itk.Image[itk.Vector[...], ...]**——这是ITK中两种不同的向量图像存储类型:
itk.VectorImage:适用于可变长度向量(实际场景中常用固定长度)的图像itk.Image[itk.Vector]:固定长度向量的标准图像类型
插值器的Python绑定默认只实例化了后者的支持,所以直接用VectorImage会触发类型不匹配的报错。
解决方案
方案1:将VectorImage转换为Image类型
把现有VectorImage转换成插值器支持的itk.Image[itk.Vector]类型,代码示例:
import itk import numpy as np # 原数组和VectorImage arr = np.random.rand(100, 100, 3).astype(np.float32) itk_img = itk.image_view_from_array(arr, is_vector=True) # 定义目标图像类型:2D、每个像素是3维float向量 vector_pixel_type = itk.Vector[itk.F, 3] target_image_type = itk.Image[vector_pixel_type, 2] # 创建目标图像并复制元数据(尺寸、间距、原点、方向) converted_img = target_image_type.New() converted_img.SetRegions(itk_img.GetLargestPossibleRegion()) converted_img.SetSpacing(itk_img.GetSpacing()) converted_img.SetOrigin(itk_img.GetOrigin()) converted_img.SetDirection(itk_img.GetDirection()) converted_img.Allocate() # 复制像素数据 itk_py_buffer = itk.PyBuffer[target_image_type] converted_arr = itk_py_buffer.GetArrayFromImage(itk_img) itk_py_buffer.SetArrayFromImage(converted_arr, converted_img) # 现在可以正常创建插值器 interpolator = itk.LinearInterpolateImageFunction[target_image_type, itk.D].New() interpolator.SetInput(converted_img)
方案2:直接使用VectorImage对应的插值器实例
尝试直接指定VectorImage类型来实例化插值器(部分ITK版本支持):
interpolator = itk.LinearInterpolateImageFunction[itk.VectorImage[itk.F, 2], itk.D].New() interpolator.SetInput(itk_img)
如果此方法报错,优先选择方案1,因为Image<Vector>是插值器更广泛支持的类型。
内容的提问来源于stack exchange,提问作者beesleep
相关产品推荐
相关产品推荐

