Используйте корреляцию фазы в качестве предварительно обрабатывающий шаг в регистрации

В этом примере показано, как использовать корреляцию фазы в качестве предварительного шага для автоматической регистрации изображений. В этом процессе вы выполняете корреляцию фазы, с помощью imregcorr, и затем передайте результат той регистрации как начальное условие основанной на оптимизации регистрации, с помощью imregister. Корреляция фазы и основанная на оптимизации регистрация являются дополнительными алгоритмами. Корреляция фазы хороша для нахождения грубого выравнивания, даже для сильно неправильно выровненных изображений. Основанная на оптимизации регистрация хороша для нахождения точного выравнивания, учитывая хорошее начальное условие.

Считайте изображение, которое будет ссылочным изображением в регистрации.

fixed = imread('cameraman.tif');
imshow(fixed);

Figure contains an axes. The axes contains an object of type image.

Создайте незарегистрированное изображение путем преднамеренного искажения этого изображения с помощью вращения, изотропного масштабирования и сдвига в направлении 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)

Figure contains an axes. The axes contains an object of type image.

Оцените регистрацию, требуемую принести эти два изображения в выравнивание. 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');

Figure contains an axes. The axes contains an object of type image.

Просмотрите выровненное изображение, наложенное на оригинальном изображении, с помощью imshowpair. В этом представлении, imshowpair использование окрашивает, чтобы подсветить области неточного совмещения.

imshowpair(fixed,movingReg,'falsecolor');

Figure contains an axes. The axes contains an object of type image.

Чтобы закончить регистрацию, используйте 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');

Figure contains an axes. The axes contains an object of type image.

Смотрите также

| | |