Поле деформации SimpleElastix равно нулю - PullRequest
0 голосов
/ 29 мая 2020

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

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

I Я также использую 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()

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

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

Затем я нашел сообщение (пользователь по имени Стив) по ссылке вверху этого сообщения ( скопировано сюда снова ):

У меня та же проблема, возвращаемые поля трехмерной деформации во многих случаях просто равны нулю, если только я не сделаю разрешение bspline намного точнее. - Стив 1 мая в 15:19

, но мне не ясно, о чем он имел в виду. Он специально использовал термин «разрешение», и я не нашел ни одного такого параметра.

Предполагая, что нужно изменить один из параметров в карте параметров, я определил несколько возможных параметров:

  • «FixedImageBSplineInterpolationOrder» (значение по умолчанию - 1)
  • «FixedKernelBSplineOrder» (значение по умолчанию - 0)
  • «FinalBSplineInterpolationOrder» (значение по умолчанию - 3)

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

DefField Dtype = вектор 32-битного числа с плавающей запятой

DefField Size = (212, 256, 30)

Интервал DefField = (0,8984379768371582, 0,8984379768371582, 5,0)

Начало поля DefField = (-104,92400360107422, -152,49099731445312, -9,2214 Min899063150 * 1051) * 1051 , Max = 0,0, 0,0

Интересно, сталкивался ли кто-нибудь с этой проблемой и может пролить свет на то, как они ее решили.

Спасибо.

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

Редактировать 1 июня:

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

...