В этом примере показано, как использовать корреляцию фазы в качестве предварительного шага для автоматической регистрации изображений. В этом процессе вы выполняете корреляцию фазы, с помощью imregcorr
, и затем передайте результат той регистрации как начальное условие основанной на оптимизации регистрации, с помощью imregister
. Корреляция фазы и основанная на оптимизации регистрация являются дополнительными алгоритмами. Корреляция фазы хороша для нахождения грубого выравнивания, даже для сильно неправильно выровненных изображений. Основанная на оптимизации регистрация хороша для нахождения точного выравнивания, учитывая хорошее начальное условие.
Считайте изображение, которое будет ссылочным изображением в регистрации.
fixed = imread('cameraman.tif');
imshow(fixed);
Создайте незарегистрированное изображение путем преднамеренного искажения этого изображения с помощью вращения, изотропного масштабирования и сдвига в направлении Y.
theta = 170; rot = [cosd(theta) sind(theta) 0;... sind(theta) cosd(theta) 0;... 0 0 1]; sc = 2.3; scale = [sc 0 0; 0 sc 0; 0 0 1]; sh = 0.5; shear = [1 sh 0; 0 1 0; 0 0 1]; tform = affine2d(shear*scale*rot); moving = imwarp(fixed,tform);
Добавьте шум в изображение и отобразите результат.
moving = moving + uint8(10*rand(size(moving))); imshow(moving)
Оцените регистрацию, требуемую принести эти два изображения в выравнивание. imregcorr
возвращает affine2d
объект, который задает преобразование.
tformEstimate = imregcorr(moving,fixed);
Применяйте предполагаемое геометрическое преобразование к неправильно выровненному изображению. Задайте 'OutputView'
чтобы убедиться зарегистрированное изображение одного размера со ссылочным изображением. Отобразите оригинальное изображение и зарегистрированное изображение рядом друг с другом. Вы видите тот imregcorr
сделал хорошее задание, обрабатывающее вращение и масштабирующее различия между изображениями. Зарегистрированное изображение, movingReg
, очень близко к тому, чтобы быть выровненным с оригинальным изображением, fixed
. Но некоторое неточное совмещение остается. imregcorr
может обработать вращение и масштабировать искажения хорошо, но не сдвинуть искажение.
Rfixed = imref2d(size(fixed)); movingReg = imwarp(moving,tformEstimate,'OutputView',Rfixed); imshowpair(fixed,movingReg,'montage');
Просмотрите выровненное изображение, наложенное на оригинальном изображении, с помощью imshowpair
. В этом представлении, imshowpair
использование окрашивает, чтобы подсветить области неточного совмещения.
imshowpair(fixed,movingReg,'falsecolor');
Чтобы закончить регистрацию, используйте imregister
, передача предполагаемого преобразования, возвращенного imregcorr
как начальное условие. imregister
является более эффективным, если два изображения находятся примерно в выравнивании в начале операции. Преобразование оценивается imregcorr
предоставляет эту информацию для imregister
. Пример использует оптимизатор по умолчанию и метрические значения для регистрации двух изображений, взятых с тем же датчиком ('monomodal'
).
[optimizer, metric] = imregconfig('monomodal'); movingRegistered = imregister(moving, fixed,... 'affine', optimizer, metric,'InitialTransformation',tformEstimate);
Отобразите результат этой регистрации. Обратите внимание на то, что imregister
достиг очень точной регистрации, учитывая хорошее начальное условие, обеспеченное imregcorr
.
imshowpair(fixed, movingRegistered,'Scaling','joint');
imregconfig
| imregcorr
| imregister
| imwarp