Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Registro de una imagen mediante correlación cruzada normalizada

Este ejemplo muestra cómo encontrar una imagen de plantilla dentro de una imagen más grande. A veces una imagen es un subconjunto de otra. La correlación cruzada normalizada se puede utilizar para determinar cómo registrar o alinear las imágenes traduciendo una de ellas.

Paso 1: leer imagen

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

figure, imshow(peppers)

Paso 2: elija subregiones de cada imagen

Es importante elegir las regiones que son similares. La imagen será la plantilla, y debe ser más pequeña que la imagen.sub_onionsub_peppers Puede obtener estas subregiones mediante el script no interactivo que se muestra debajo del script interactivo.or

% 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)

Paso 3: hacer correlación cruzada normalizada y buscar coordenadas de pico

Calcule la correlación cruzada normalizada y mostrarla como una gráfica de superficie. El pico de la matriz de correlación cruzada se produce donde los sub_images se correlacionan mejor. sólo funciona en imágenes en escala de grises, por lo que pasamos el plano rojo de cada imagen secundaria.normxcorr2

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

Paso 4: encuentra el desplazamiento total entre las imágenes

El desfase total o la traslación entre imágenes depende de la ubicación del pico en la matriz de correlación cruzada y del tamaño y la posición de las subimágenes.

% 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);

Paso 5: ver si la imagen de cebolla fue extraída de la imagen de pimientos

Averiguar dónde cae dentro de.onionpeppers

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 

Paso 6: PAD la imagen de la cebolla al tamaño de la imagen de los pimientos

Pad la imagen para superponer, utilizando el desfase determinado anteriormente.onionpeppers

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

Paso 7: utilice mezcla alfa para mostrar imágenes juntas

Visualice un plano de la imagen con la imagen mediante combinación alfa.peppersrecovered_onion

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