Я регистрирую два 3D-изображения itk. Фиксированный - 240 * 240 * 285, а движущийся - 80 * 80 * 17. Я пытаюсь использовать affineTransform для их регистрации, но обнаружил, что разница в размерах изображений слишком велика и регистрация не работает. Чтобы перепрограммировать движущееся изображение и установить его размер на фиксированный, используя линейный интерполятор.
Но проблема возникает. Скорость регистрации очень медленная, и для завершения одного набора регистрации данных требуется больше часа. Но у меня 40 комплектов!
Может ли кто-нибудь продвигать более быстрый способ регистрации или я сделал что-то неправильно в регистрации?
Вот код повторной выборки:
ResampleFilterType::Pointer movingResampler = ResampleFilterType::New();
InterpolatorType::Pointer movingInterpolator = InterpolatorType::New();
movingResampler->SetInput(movingImg);
movingResampler->SetInterpolator(movingInterpolator);
//set the parameters from the fixed image
movingResampler->SetSize(fixedImg->GetLargestPossibleRegion().GetSize());
movingResampler->Update();
Вот код оптимизатора:
optimizer->SetMaximumStepLength(0.01);
optimizer->SetMinimumStepLength(0.0001);
optimizer->SetNumberOfIterations(300);
optimizer->MinimizeOn();
Большое спасибо, Арвин
Повторная выборка изображения не требуется, если вы используете достойный интерполятор (линейный, вероятно, уже работает очень хорошо).
То, что вы, возможно, захотите проверить, это то, что изображения сначала пересекаются в мировой системе координат. В противном случае вам нужно выполнить инициализацию, чтобы приблизить их друг к другу. Также вам нужно предоставить достойное значение для центра точки вращения.
Если ваша цель - просто зарегистрировать изображения, вы можете рассмотреть возможность использования elastix (http://elastix.isi.uu.nl/), командной строки, которая, по моему опыту, может регистрировать такие изображения в меньше минуты. Аффинное преобразование в elastix также имеет параметры автоматической инициализации, просто ознакомьтесь с руководством elastix, чтобы начать работу.
Если вы используете ITK, вы можете использовать itk :: CenteredTransformInitializer для инициализации преобразования.
//Initialize transform initializer TransformInitializerType::Pointer initializer = TransformInitializerType::New(); initializer->SetTransform(transform); initializer->SetFixedImage(fixedImg); initializer->SetMovingImage(tmpMovingImg); initializer->MomentsOn(); initializer->InitializeTransform();