Поле деформации SimpleElastix равно нулю

У меня аналогичная / та же проблема, что и опубликованная здесь:

Простая проблема ITK при сохранении поля деформации: поле деформации пусто

Я также использую SimpleElastix 1.2.0rc2.dev1162-g2a79d с Python3, Anaconda Jupyter, и я также пробовал использовать PyCharm (обошел некоторые из ограничений, которые кажутся очевидными в Jupyter, как подробно описано в некоторых комментариях в коде ниже).

Я начал с регистрации:

# Initiate ElastixImageFilter:
ElastixImFilt = sitk.ElastixImageFilter()
ElastixImFilt.LogToConsoleOn() # <-- no output in Jupyter, works in PyCharm
ElastixImFilt.LogToFileOn() # <-- works only once per kernel in Jupyter, works fine in PyCharm

# Define the fixed and moving images:
ElastixImFilt.SetFixedImage(FixedIm)
ElastixImFilt.SetMovingImage(MovingIm)

# Get the default parameter map template:
ParamMap = sitk.GetDefaultParameterMap('affine')

# Set registration parameters:
ParamMap['AutomaticTransformInitialization'] = ['true']
ParamMap['AutomaticTransformInitializationMethod'] = ['GeometricalCenter']
ParamMap['WriteIterationInfo'] = ['true']
ParamMap['MaximumNumberOfIterations'] = ['512']
ParamMap['UseDirectionCosines'] = ['true']

# Set the parameter map:
ElastixImFilt.SetParameterMap(ParamMap)

# Register the 3D images:
ElastixImFilt.Execute()

# Get the registered image:
RegIm = ElastixImFilt.GetResultImage()

что казалось нормальным. Тогда я попытался получить поле деформации, используя карту параметров, которая использовалась для регистрации:

# Get the current working directory:
CurrentWorkingDir = os.getcwd()

# Get the transform parameter map:
#TransformParameterMap = ElastixImFilt.GetParameterMap()

# Initiate TransformixImageFilter:
TransformixImFilt = sitk.TransformixImageFilter()
TransformixImFilt.LogToConsoleOn() # <-- no output in Jupyter, OK in PyCharm
TransformixImFilt.LogToFileOn() 
TransformixImFilt.SetOutputDirectory(CurrentWorkingDir) # <-- makes no difference, still no output in Jupyter

# Set up for computing deformation field:
TransformixImFilt.ComputeDeformationFieldOn() # <-- no output in Jupyter or PyCharm

# Set up other computations to see if they produce output:
TransformixImFilt.ComputeSpatialJacobianOn() # <-- produces 'spatialJacobian.nii'
TransformixImFilt.ComputeDeterminantOfSpatialJacobianOn() # <-- produces 'fullSpatialJacobian.nii'

# Set the transform parameter map:
TransformixImFilt.SetTransformParameterMap(ElastixImFilt.GetTransformParameterMap())

# Need to explicitely tell elastix that the image is 3D since by default it will
# only transform to 2D:
TransformixImFilt.SetMovingImage(MovingIm)

# Transform the contour points:
TransformixImFilt.Execute()

# Get the deformation field:
DeformationField = TransformixImFilt.GetDeformationField()

Поле деформации не экспортировалось (хотя якобиан и его определитель были). Я нашел частично успешный обходной путь, который я не буду здесь вдаваться в подробности.

Когда мне наконец удалось экспортировать поле деформации (в файл.nii), я обнаружил, что все записи нулевые.

Then I found a post (user called Steve) at the link at the top of this post (copied here again):

I am having the same problem, the returned 3D deformation fields are simply zero in many cases, unless I make the bspline resolution much finer. – Steve May 1 at 15:19

but it's not clear to me what he was referring to. He used the term "resolution" specifically and I haven't found any such parameter.

Assuming that what needs to be changed is one of the parameters in the parameter map, I identified a few possible parameters:

  • "FixedImageBSplineInterpolationOrder" (default value is 1)
  • "FixedKernelBSplineOrder" (default value is 0)
  • "FinalBSplineInterpolationOrder" (default value is 3)

I reasoned that FinalBSplineInterpolationOrder might be the most likely parameter of relevance, so I increased the order from 3 to 5 (the maximum allowed value) but the result is still null. Here's some output printed to the console about the deformation field image that was exported then loaded from the.nii file:

DefField Dtype = vector of 32-bit float

DefField Size = (212, 256, 30)

DefField Spacing = (0.8984379768371582, 0.8984379768371582, 5.0)

DefField Origin = (-104.92400360107422, -152.49099731445312, -9.221489906311035)

DefField Min, Max = 0.0, 0.0

I wonder if anyone has come across this issue and can shed some light on how they resolved it.

Thanks.

PS: я не хотел делать этот вопрос длиннее, чем он есть, но в дополнение к вышеупомянутой проблеме, экспорт изображения деформации (в виде файла.nii), похоже, происходит только один раз (при перезагрузке компьютера кажется), что делает любую попытку попробовать что-то новое очень утомительно. Так что, если кто-нибудь знает, почему это может происходить, я был бы очень признателен за помощь.

Изменить 1 июня:

Вернувшись к разделу 4.3 в руководстве по Elastix, он предупреждает, что FinalBSplineInterpolationOrder должен быть установлен в 0 при деформации двоичной маски. Я здесь не этим занимаюсь, но я рассудил, что точки деформации могут также потребовать, чтобы он был равен 0 (?). Поэтому я перезапустил Transformix как таковой, но все равно получил индексы / точки, превышающие размеры / физический объем изображения, и поле нулевой деформации.

0 ответов

Другие вопросы по тегам