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.

xcorr2

Correlación cruzada 2D

Descripción

ejemplo

c = xcorr2(a,b) devuelve la correlación cruzada de las matrices a y b sin escalado. xcorr2 es la versión bidimensional de xcorr.

c = xcorr2(a) es la matriz de autocorrelación de la matriz de entrada a. Esta sintaxis es equivalente a xcorr2(a,a).

Ejemplos

contraer todo

Cree dos matrices, M1 y M2.

M1 = [17 24  1  8 15;
      23  5  7 14 16;
       4  6 13 20 22;
      10 12 19 21  3;
      11 18 25  2  9];

M2 = [8 1 6;
      3 5 7;
      4 9 2];

M1 es de 5 por 5 y M2 es de 3 por 3, por lo que su correlación cruzada tiene un tamaño de (5+3-1) por (5+3-1), o 7 por 7. En términos de desfases, la matriz resultante es

C=(c-2,-2c-2,-1c-2,0c-2,1c-2,2c-2,3c-2,4c-1,-2c-1,-1c-1,0c-1,1c-1,2c-1,3c-1,4c0,-2c0,-1c0,0c0,1c0,2c0,3c0,4c1,-2c1,-1c1,0c1,1c1,2c1,3c1,4c2,-2c2,-1c2,0c2,1c2,2c2,3c2,4c3,-2c3,-1c3,0c3,1c3,2c3,3c3,4c4,-2c4,-1c4,0c4,1c4,2c4,3c4,4).

Como ejemplo, calcule el elemento c0,2 (o C(3,5) en MATLAB®, puesto que M2 es de 3 por 3). Alinee las dos matrices de forma que sus elementos (1,1) coincidan. Esta disposición corresponde a c0,0. Para encontrar c0,2, desplace M2 dos filas a la derecha.

Ahora M2 se sitúa por encima de la matriz M1(1:3,3:5). Calcule los productos elemento por elemento y súmelos. La respuesta debería ser

1×8+7×3+13×4+8×1+14×5+20×9+15×6+16×7+22×2=585.

[r2,c2] = size(M2);

CC = sum(sum(M1(0+(1:r2),2+(1:c2)).*M2))
CC = 585

Verifique el resultado utilizando xcorr2.

D = xcorr2(M1,M2);

DD = D(0+r2,2+c2)
DD = 585

Dada una matriz X de tamaño M×N y una matriz H de tamaño P×Q, su correlación cruzada bidimensional, C=XH, es una matriz de tamaño (M+P-1)×(N+Q-1) con elementos

C(k,l)=Tr{XHkl}1kM+P-1,1lN+Q-1.

Tr es la traza, y la daga determina la conjugación hermítica. Las matrices X y Hkl tienen tamaños (M+2(P-1))×(N+2(Q-1)) y elementos distintos de cero dados por

X(m,n)=X(m-P+1,n-Q+1),PmM+P-1,QnN+Q-1

y

Hkl(p,q)=H(p-k+1,q-l+1),kpP+k-1,lqQ+l-1.

Llamar a xcorr2 equivale a este procedimiento para matrices complejas generales de tamaño arbitrario.

Cree dos matrices complejas, X de tamaño 7×22 y H de tamaño 6×17.

X = randn([7 22])+1j*randn([7 22]);
H = randn([6 17])+1j*randn([6 17]);

[M,N] = size(X);
m = 1:M;
n = 1:N;

[P,Q] = size(H);
p = 1:P;
q = 1:Q;

Inicialice X y C.

Xt = zeros([M+2*(P-1) N+2*(Q-1)]);
Xt(m+P-1,n+Q-1) = X;
C = zeros([M+P-1 N+Q-1]);

Calcule los elementos de C formando un bucle con k y l. Restablezca Hkl en cero en cada paso. Ahorre tiempo y memoria sumando productos de los elementos en lugar de multiplicar y tomar la traza.

for k = 1:M+P-1
    for l = 1:N+Q-1
        Hkl = zeros([M+2*(P-1) N+2*(Q-1)]);
        Hkl(p+k-1,q+l-1) = H;
        C(k,l) = sum(sum(Xt.*conj(Hkl)));
    end
end

max(max(abs(C-xcorr2(X,H))))
ans = 1.5139e-14

La respuesta coincide con precisión de máquina con la salida de xcorr2.

Utilice la correlación cruzada para encontrar dónde encaja una sección de una imagen en el conjunto. La correlación cruzada permite encontrar las regiones en las que dos señales se parecen más la una a la otra. En señales bidimensionales, como las imágenes, utilice xcorr2.

Cargue una imagen de prueba en blanco y negro en el área de trabajo. Muéstrela con imagesc.

load durer
img = X;
White = max(max(img));

imagesc(img)
axis image off
colormap gray
title('Original')

Figure contains an axes object. The axes object with title Original contains an object of type image.

Seleccione una sección rectangular de la imagen. Muestre la imagen más grande sin esa sección.

x = 435;
X = 535;
szx = x:X;

y = 62;
Y = 182;
szy = y:Y;

Sect = img(szx,szy);

kimg = img;
kimg(szx,szy) = White;

kumg = White*ones(size(img));
kumg(szx,szy) = Sect;

subplot(1,2,1)
imagesc(kimg)
axis image off
colormap gray
title('Image')

subplot(1,2,2)
imagesc(kumg)
axis image off
colormap gray
title('Section')

Figure contains 2 axes objects. Axes object 1 with title Image contains an object of type image. Axes object 2 with title Section contains an object of type image.

Utilice xcorr2 para encontrar dónde encaja la imagen pequeña en la imagen más grande. Reste el valor medio para que haya aproximadamente el mismo número de valores negativos y positivos.

nimg = img-mean(mean(img));
nSec = nimg(szx,szy);

crr = xcorr2(nimg,nSec);

El valor máximo de la correlación cruzada corresponde a la ubicación estimada de la esquina inferior derecha de la sección. Utilice ind2sub para convertir la ubicación unidimensional del valor máximo en coordenadas bidimensionales.

[ssr,snd] = max(crr(:));
[ij,ji] = ind2sub(size(crr),snd);

figure
plot(crr(:))
title('Cross-Correlation')
hold on
plot(snd,ssr,'or')
hold off
text(snd*1.05,ssr,'Maximum')

Figure contains an axes object. The axes object with title Cross-Correlation contains 3 objects of type line, text. One or more of the lines displays its values using only markers

Coloque la imagen más pequeña dentro de la imagen más grande. Rote la imagen más pequeña para cumplir con la convención que utiliza MATLAB® para mostrar imágenes. Dibuje un rectángulo alrededor de ella.

img(ij:-1:ij-size(Sect,1)+1,ji:-1:ji-size(Sect,2)+1) = rot90(Sect,2);

imagesc(img)
axis image off
colormap gray
title('Reconstructed')
hold on
plot([y y Y Y y],[x X X x x],'r')
hold off

Figure contains an axes object. The axes object with title Reconstructed contains 2 objects of type image, line.

Desplace una plantilla en una cantidad conocida y recupere el desplazamiento utilizando la correlación cruzada.

Cree una plantilla en una matriz de 11 por 11. Cree una matriz de 22 por 22 y desplace la plantilla original en 8 a lo largo de la dimensión de fila y en 6 a lo largo de la dimensión de columna.

template = 0.2*ones(11);
template(6,3:9) = 0.6;
template(3:9,6) = 0.6;
offsetTemplate = 0.2*ones(22);
offset = [8 6];
offsetTemplate((1:size(template,1))+offset(1), ...
    (1:size(template,2))+offset(2)) = template;

Represente la señal original y las plantillas desplazadas.

imagesc(offsetTemplate)
colormap gray
hold on
imagesc(template)
axis equal

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

Correlacione en forma cruzada las dos matrices y encuentre el valor máximo absoluto de la correlación cruzada. Utilice la posición del valor máximo absoluto para determinar el desplazamiento en la plantilla. Compare el resultado con el desplazamiento conocido.

cc = xcorr2(offsetTemplate,template);
[max_cc, imax] = max(abs(cc(:)));
[ypeak, xpeak] = ind2sub(size(cc),imax(1));
corr_offset = [(ypeak-size(template,1)) (xpeak-size(template,2))];

isequal(corr_offset,offset)
ans = logical
   1

El desplazamiento obtenido de la correlación cruzada es igual al desplazamiento conocido de la plantilla en las dimensiones de fila y columna.

Este ejemplo requiere el software Parallel Computing Toolbox™. Consulte GPU Computing Requirements (Parallel Computing Toolbox) para ver las GPU que se admiten.

Desplace una plantilla en una cantidad conocida y recupere el desplazamiento utilizando la correlación cruzada.

Cree una plantilla en una matriz de 11 por 11. Cree una matriz de 22 por 22 y desplace la plantilla original en 8 a lo largo de la dimensión de fila y en 6 a lo largo de la dimensión de columna.

template = 0.2*ones(11); 
template(6,3:9) = 0.6;   
template(3:9,6) = 0.6;
offsetTemplate = 0.2*ones(22); 
offset = [8 6];
offsetTemplate((1:size(template,1))+offset(1), ...
    (1:size(template,2))+offset(2)) = template;

Coloque las matrices de la plantilla original y de la desplazada en su GPU utilizando objetos gpuArray.

template = gpuArray(template);
offsetTemplate = gpuArray(offsetTemplate);

Calcule la correlación cruzada en la GPU.

cc = xcorr2(offsetTemplate,template);

Devuelva el resultado al área de trabajo de MATLAB® mediante gather. Utilice el valor máximo absoluto de la correlación cruzada para determinar el desplazamiento y compare el resultado con el desplazamiento conocido.

cc = gather(cc);
[max_cc,imax] = max(abs(cc(:)));
[ypeak,xpeak] = ind2sub(size(cc),imax(1));
corr_offset = [(ypeak-size(template,1)) (xpeak-size(template,2))];
isequal(corr_offset,offset)
ans = logical
   1

Argumentos de entrada

contraer todo

Arreglos de entrada, especificados como matrices.

Ejemplo: sin(2*pi*(0:9)'/10)*sin(2*pi*(0:13)/20) especifica una superficie sinusoidal bidimensional.

Tipos de datos: single | double
Soporte de números complejos:

Argumentos de salida

contraer todo

Correlación cruzada 2D o matriz de autocorrelación, devueltas como matriz.

Más acerca de

contraer todo

Correlación cruzada 2D

La correlación cruzada 2D de una matriz de M porN, X, y una matriz de P por Q, H, es una matriz C de tamaño M+P–1 por N+Q–1. Sus elementos vienen dados por

C(k,l)=m=0M1n=0N1X(m,n)H¯(mk,nl),(P1)kM1,(Q1)lN1,

donde la barra sobre H denota la conjugación compleja.

La matriz de salida, C(k,l), tiene índices de filas y columnas negativos y positivos.

  • Un índice de fila negativo corresponde a un desplazamiento ascendente de las filas de H.

  • Un índice de columna negativo corresponde a un desplazamiento a la izquierda de las columnas de H.

  • Un índice de fila positivo corresponde a un desplazamiento descendente de las filas de H.

  • Un índice de columna positivo corresponde a un desplazamiento a la derecha de las columnas de H.

Para convertir los índices a la forma de MATLAB®, añada el tamaño de H: el elemento C(k,l) corresponde a C(k+P,l+Q) en el área de trabajo.

Por ejemplo, considere esta correlación cruzada 2D:

X = ones(2,3);
H = [1 2; 3 4; 5 6];  % H is 3 by 2
C = xcorr2(X,H)
C =
     6    11    11     5
    10    18    18     8
     6    10    10     4
     2     3     3     1

El elemento C(1,1) de la salida corresponde a C(1–3,1–2) = C(–2,–1) en la ecuación de definición, que utiliza indexación de base cero. Para calcular el elemento C(1,1), desplace H dos filas hacia arriba y una columna hacia la izquierda. De este modo, el único producto en la suma de correlación cruzada es X(1,1)*H(3,2) = 6. Al utilizar la ecuación de definición, obtiene

C(2,1)=m=01n=02X(m,n)H¯(m+2,n+1)=X(0,0)H¯(2,1)=1×6=6,

con todos los demás términos en la suma doble igual a cero.

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido antes de R2006a

Consulte también

| |