Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Registrar una imagen usando la correlación cruzada normalizada

Este ejemplo muestra cómo encontrar una imagen plantilla en una imagen más grande. En ocasiones, una imagen es el subconjunto de otra. La correlación cruzada normalizada se puede utilizar para determinar cómo registrar o alinear imágenes trasladando una de ellas.

Paso 1: Leer la imagen

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.

Paso 2: Escoger las subregiones de cada imagen

Es importante escoger regiones parecidas. La imagen sub_onion será la plantilla, y debe ser más pequeña que la imagen sub_peppers. Puede obtener estas subregiones utilizando el script no interactivo o el script interactivo que aparecen a continuación.

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

Paso 3: Calcular la correlación cruzada normalizada y encontrar las coordenadas del pico

Calcule la correlación cruzada normalizada y muéstrela como una gráfica de superficie. El pico de la matriz de correlación cruzada ocurre donde las subimágenes tienen una mejor correlación. normxcorr2 solo funciona con imágenes en escala de grises, de modo que le pasamos el plano rojo de cada subimagen.

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.

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

El desplazamiento o traslación total 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: Comprobar si la imagen de la cebolla ha sido extraída de la imagen de los pimientos

Descubra dónde se encuadra la imagen onion dentro de la imagen 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

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

Superponga la imagen onion a la imagen peppers, de acuerdo con el desplazamiento determinado anteriormente.

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.

Paso 7: Utilizar la composición alfa para mostrar dos imágenes juntas

Muestre un plano de la imagen peppers con la imagen recovered_onion utilizando la composición alfa.

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

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