Contenido principal

Registrar una imagen usando la correlación cruzada normalizada

Este ejemplo muestra cómo determinar la traslación necesaria para alinear dos imágenes mediante correlación cruzada normalizada.

Leer imágenes

Lea y muestre dos imágenes. Para este ejemplo, las imágenes tienen diferentes tamaños.

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

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

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

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

Escoger las subregiones de cada imagen

Elija las subregiones de cada imagen de modo que el pico de la matriz de correlación cruzada sea fácil de identificar. 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 estos comandos.

rect_onion = [111 33 65 58];
rect_peppers = [163 47 143 151];
sub_onion = imcrop(onion,rect_onion);
sub_peppers = imcrop(peppers,rect_peppers);

Si desea seleccionar subregiones de forma interactiva, puede utilizar estos comandos.

[sub_onion,rect_onion] = imcrop(onion); % Choose the pepper below the onion
[sub_peppers,rect_peppers] = imcrop(peppers); % Choose the whole onion

Muestre las subregiones.

imshow(sub_onion)

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

imshow(sub_peppers)

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

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 se le pasa el primer canal de cada subimagen.

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

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

Encuentre las coordenadas del pico.

[max_c,imax] = max(abs(c(:)));
[ypeak,xpeak] = ind2sub(size(c),imax(1));

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

Registrar imágenes y verificar los resultados

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

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 hidden axes object contains an object of type image.

Confirme el registro mostrando 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 hidden axes object contains an object of type image.

Consulte también

|