Main Content

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