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)
peppers = imread("peppers.png");
imshow(peppers)
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)
imshow(sub_peppers)
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
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)
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")