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)
imshow(peppers)
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)
imshow(sub_peppers)
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
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)
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")