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

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

Шаг 1: Readimage

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

imshow(onion)

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

imshow(peppers)

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

Шаг 2: выберите Subregions of Each Image

Важно выбрать области, которые подобны. Изображение 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
imshow(sub_onion)

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

imshow(sub_peppers)

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

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

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

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

Figure contains an axes object. The axes object 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;
imshow(recovered_onion)

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

Шаг 7: используйте альфу, смешивающуюся, чтобы показать изображения вместе

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

imshowpair(peppers(:,:,1),recovered_onion,"blend")

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