xcorr2
Correlación cruzada 2D
Sintaxis
Descripción
Ejemplos
Tamaño de la matriz de salida y cálculo de elementos
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
Como ejemplo, calcule el elemento (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 . Para encontrar , 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
[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
Correlación cruzada bidimensional de matrices complejas arbitrarias
Dada una matriz de tamaño y una matriz de tamaño , su correlación cruzada bidimensional, , es una matriz de tamaño con elementos
es la traza, y la daga determina la conjugación hermítica. Las matrices y tienen tamaños y elementos distintos de cero dados por
y
Llamar a xcorr2
equivale a este procedimiento para matrices complejas generales de tamaño arbitrario.
Cree dos matrices complejas, de tamaño y de tamaño .
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 y .
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 formando un bucle con y . Restablezca 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
.
Alinear dos imágenes mediante correlación cruzada
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 espacio de trabajo. Muéstrela con imagesc
.
load durer img = X; White = max(max(img)); imagesc(img) axis image off colormap gray title('Original')
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')
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')
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
Recuperación de desplazamiento de plantilla con correlación cruzada
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
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.
Aceleración por GPU para cálculo de matrices de correlación cruzada
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 espacio 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
a
, b
— Arreglos de entrada
matrices | Objetos gpuArray
Arreglos de entrada, especificados como matrices u objetos gpuArray
.
Consulte Run MATLAB Functions on a GPU (Parallel Computing Toolbox) y GPU Computing Requirements (Parallel Computing Toolbox) para obtener más información acerca de cómo utilizar xcorr2
con objetos gpuArray
(Parallel Computing Toolbox).
Ejemplo: sin(2*pi*(0:9)'/10)*sin(2*pi*(0:13)/20)
especifica una superficie sinusoidal bidimensional.
Ejemplo: gpuArray(sin(2*pi*(0:9)'/10)*sin(2*pi*(0:13)/20))
especifica una superficie sinusoidal bidimensional como objeto
.gpuArray
Tipos de datos: single
| double
Soporte de números complejos: Sí
Argumentos de salida
c
— Correlación cruzada 2D o matriz de autocorrelación
matriz | objeto gpuArray
Correlación cruzada 2D o matriz de autocorrelación, devueltas como matriz u objeto gpuArray
.
Más acerca de
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
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 espacio 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
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™.
Arreglos GPU
Acelere código mediante la ejecución en una unidad de procesamiento gráfico (GPU) mediante Parallel Computing Toolbox™.
Esta función es totalmente compatible con los arreglos de GPU. Para obtener más información, consulte Run MATLAB Functions on a GPU (Parallel Computing Toolbox).
Historial de versiones
Introducido antes de R2006a
Abrir ejemplo
Tiene una versión modificada de este ejemplo. ¿Desea abrir este ejemplo con sus modificaciones?
Comando de MATLAB
Ha hecho clic en un enlace que corresponde a este comando de MATLAB:
Ejecute el comando introduciéndolo en la ventana de comandos de MATLAB. Los navegadores web no admiten comandos de MATLAB.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)