Этот пример показывает, как использовать корреляцию фазы в качестве предварительного шага для автоматической регистрации изображений. В этом процессе вы выполняете корреляцию фазы, с помощью 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