В этом примере показано, как найти шаблон изображения в большем изображении. Иногда одно изображение является подмножеством другого. Нормированная перекрестная корреляция может использоваться, чтобы определить, как зарегистрировать или выровнять изображения путем перевода одного из них.
onion = imread('onion.png'); peppers = imread('peppers.png'); imshow(onion)
figure, imshow(peppers)
Важно выбирать области, которые похожи. Изображение 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, imshow(sub_peppers)
Вычислите нормированную перекрестную корреляцию и отобразите ее как объемная поверхностная диаграмма. Пик матрицы перекрестной корреляции происходит там, где sub_images лучше всего коррелируются. normxcorr2
работает только на полутоновых изображениях, поэтому передаем ему красную плоскость каждого вспомогательного изображения.
c = normxcorr2(sub_onion(:,:,1),sub_peppers(:,:,1));
figure, surf(c), shading flat
Общее смещение или перемещение между изображениями зависит от местоположения пика в матрице перекрестной корреляции, а также от размера и положения вспомогательных изображений.
% 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);
Выясните, где 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
Дополните onion
изображение для наложения на peppers
, с использованием смещения, определенного выше.
recovered_onion = uint8(zeros(size(peppers))); recovered_onion(ybegin:yend,xbegin:xend,:) = onion; figure, imshow(recovered_onion)
Отобразите одну плоскость peppers
изображение со recovered_onion
изображение с использованием альфа-смешения.
figure, imshowpair(peppers(:,:,1),recovered_onion,'blend')