Регистрация изображения с использованием нормированной перекрестной корреляции

В этом примере показано, как найти шаблон изображения в большем изображении. Иногда одно изображение является подмножеством другого. Нормированная перекрестная корреляция может использоваться, чтобы определить, как зарегистрировать или выровнять изображения путем перевода одного из них.

Шаг 1: Чтение изображения

onion = imread('onion.png');
peppers = imread('peppers.png');

imshow(onion)

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

figure, imshow(peppers)

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

Шаг 2: Выберите субрегионы каждого изображения

Важно выбирать области, которые похожи. Изображение sub_onion будет шаблоном и должен быть меньше изображения sub_peppers. Вы можете получить эти подпрограммы областей используя либо неинтеративный скрипт ниже, либо интерактивный скрипт.

% non-interactively
rect_onion = [111 33 65 58];
rect_peppers = [163 47 143 151];
sub_onion = imcrop(onion,rect_onion);
sub_peppers = imcrop(peppers,rect_peppers);

% OR 
   
% interactively
%[sub_onion,rect_onion] = imcrop(onion); % choose the pepper below the onion
%[sub_peppers,rect_peppers] = imcrop(peppers); % choose the whole onion

% display sub images
figure, imshow(sub_onion)

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

figure, imshow(sub_peppers)

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

Шаг 3: Сделайте нормированную перекрестную корреляцию и найдите координаты пика

Вычислите нормированную перекрестную корреляцию и отобразите ее как объемная поверхностная диаграмма. Пик матрицы перекрестной корреляции происходит там, где sub_images лучше всего коррелируются. normxcorr2 работает только на полутоновых изображениях, поэтому передаем ему красную плоскость каждого вспомогательного изображения.

c = normxcorr2(sub_onion(:,:,1),sub_peppers(:,:,1));
figure, surf(c), shading flat

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

Шаг 4: Найти общее смещение между изображениями

Общее смещение или перемещение между изображениями зависит от местоположения пика в матрице перекрестной корреляции, а также от размера и положения вспомогательных изображений.

% offset found by correlation
[max_c, imax] = max(abs(c(:)));
[ypeak, xpeak] = ind2sub(size(c),imax(1));
corr_offset = [(xpeak-size(sub_onion,2)) 
               (ypeak-size(sub_onion,1))];

% relative offset of position of subimages
rect_offset = [(rect_peppers(1)-rect_onion(1)) 
               (rect_peppers(2)-rect_onion(2))];

% total offset
offset = corr_offset + rect_offset;
xoffset = offset(1);
yoffset = offset(2);

Шаг 5: Посмотрите, было ли изображение лука извлечено из изображения перца

Выясните, где onion падает внутрь peppers.

xbegin = round(xoffset+1);
xend   = round(xoffset+ size(onion,2));
ybegin = round(yoffset+1);
yend   = round(yoffset+size(onion,1));

% extract region from peppers and compare to onion
extracted_onion = peppers(ybegin:yend,xbegin:xend,:);
if isequal(onion,extracted_onion) 
   disp('onion.png was extracted from peppers.png')
end
onion.png was extracted from peppers.png

Шаг 6: Дополните изображение лука размером с изображение перца

Дополните onion изображение для наложения на peppers, с использованием смещения, определенного выше.

recovered_onion = uint8(zeros(size(peppers)));
recovered_onion(ybegin:yend,xbegin:xend,:) = onion;
figure, imshow(recovered_onion)

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

Шаг 7: Используйте Alpha Blending, чтобы показать изображения вместе

Отобразите одну плоскость peppers изображение со recovered_onion изображение с использованием альфа-смешения.

figure, imshowpair(peppers(:,:,1),recovered_onion,'blend')

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

Для просмотра документации необходимо авторизоваться на сайте