У меня такая же / та же проблема, что и здесь:
Простая проблема 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 как таковой, но все равно получил индексы / точки, превышающие размеры / физический объем изображения, и поле нулевой деформации.