Main Content

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

En este ejemplo se 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.

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

Paso 1: Leer imagen

figure, imshow(peppers)

Paso 2: Elija subregiones de cada imagen

Es importante elegir regiones que sean similares. La imagen será la plantilla y debe ser más pequeña que la imagen.sub_onionsub_peppers Puede obtener estas subregiones utilizando el script no interactivo debajo del script interactivo.O

% 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 encontrar coordenadas de pico

Calcule la correlación cruzada normalizada y muéstrala como un trazado de superficie. El pico de la matriz de correlación cruzada se produce donde los sub_images están mejor correlacionados. sólo funciona en imágenes en escala de grises, por lo que le pasamos el plano rojo de cada subimagen.normxcorr2

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

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

El desplazamiento total o la traducció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 se extrajo de la imagen de los 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: Acolcha la imagen de cebolla al tamaño de la imagen de los pimientos

Ande la imagen en la que desea superponerla, utilizando el desplazamiento determinado anteriormente.onionpeppers

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

Paso 7: Utilice Alpha Blending para mostrar imágenes juntas

Muestre un plano de la imagen con la imagen utilizando la fusión alfa.peppersrecovered_onion

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