xcorr2

2-D перекрестную корреляцию

Описание

пример

c = xcorr2(a,b) возвращает перекрестную корреляцию матриц a и b без масштабирования. xcorr2 - двумерная версия xcorr.

c = xcorr2(a) - автокорреляционная матрица входа матрицы a. Этот синтаксис эквивалентен xcorr2(a,a).

Примеры

свернуть все

Создайте две матрицы, M1 и 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 5 на 5 и M2 3 на 3, поэтому их перекрестная корреляция имеет размер (5 + 3-1) -by- (5 + 3-1), или 7 на 7. С точки зрения лагов получившаяся матрица является

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

В качестве примера вычислите элемент c0,2 (или C(3,5) в MATLAB ®, с M2 3 на 3). Выровняйте две матрицы так, чтобы их (1,1) элементы совпадают. Это размещение соответствует c0,0. Найти c0,2, слайд M2 двумя строками вправо.

Теперь M2 находится поверх матрицы M1(1:3,3:5). Вычислите продукты элемента по элементам и суммируйте их. Ответ должен быть

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

Проверьте результат используя xcorr2.

D = xcorr2(M1,M2);

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

Задана матрица X размера M×N и матрицу H размера P×Q, их двумерная перекрестная корреляция, C=XH, является матрицей размера (M+P-1)×(N+Q-1) с элементами

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

Tr является следом, и кинжал обозначает гермитовское сопряжение. Матрицы X и Hkl иметь размер (M+2(P-1))×(N+2(Q-1)) и ненулевые элементы, заданные как

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

и

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

Вызывающие xcorr2 эквивалентно этой процедуре для общих комплексных матриц произвольного размера.

Создайте две комплексные матрицы, X размера 7×22 и H размера 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;

Инициализировать X и 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]);

Вычислите элементы C путем закольцовывания k и l. Сброс Hkl для нуля на каждом шаге. Экономьте время и память, суммируя продукты элемента вместо умножения и взятия трассировки.

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

Ответ совпадает с точностью машины с выходом xcorr2.

Используйте перекрестную корреляцию, чтобы найти, где раздел изображения подходит в целом. Перекрестная корреляция позволяет вам найти области, в которых два сигнала наиболее напоминают друг друга. Для двумерных сигналов, как и изображения, используйте xcorr2.

Загрузите черно-белое тестовое изображение в рабочую область. Отобразите его с imagesc.

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

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

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

Выберите прямоугольное сечение изображения. Отображение большего изображения с отсутствующим разделом.

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. Axes 1 with title Image contains an object of type image. Axes 2 with title Section contains an object of type image.

Использование xcorr2 чтобы найти, где маленькое изображение помещается на большем изображении. Вычесть среднее значение так, чтобы было примерно равное число отрицательных и положительных значений.

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

crr = xcorr2(nimg,nSec);

Максимальное значение перекрестной корреляции соответствует предполагаемому местоположению нижнего правого угла разреза. Использование ind2sub для преобразования одномерного местоположения максимума в двумерные координаты.

[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. The axes with title Cross-Correlation contains 3 objects of type line, text.

Поместите меньшее изображение внутрь большего изображения. Поверните меньшее изображение, чтобы соответствовать соглашению, которое MATLAB ® использует для отображения изображений. Нарисуйте прямоугольник вокруг него.

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. The axes with title Reconstructed contains 2 objects of type image, line.

Сдвиньте шаблон на известную величину и восстановите сдвиг с помощью перекрестной корреляции.

Создайте шаблон в матрице 11 на 11. Создайте матрицу 22 на 22 и сместите исходный шаблон на 8 по размерности строки и 6 по размерности столбца.

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;

Постройте график исходных и сдвинутых шаблонов.

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

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

Перекрестная корреляция двух матриц и нахождение максимального абсолютного значения перекрестной корреляции. Используйте положение максимального абсолютного значения, чтобы определить сдвиг в шаблоне. Проверьте результат на соответствие известному сдвигу.

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

Сдвиг, полученный из перекрестной корреляции, равен известному сдвигу шаблона в размерностях строка и столбец.

Этот пример требует программного обеспечения Parallel Computing Toolbox™. Обратитесь к разделу Поддержка GPU по версии (Parallel Computing Toolbox), чтобы узнать, какие графические процессоры поддерживаются.

Сдвиньте шаблон на известную величину и восстановите сдвиг с помощью перекрестной корреляции.

Создайте шаблон в матрице 11 на 11. Создайте матрицу 22 на 22 и сместите исходный шаблон на 8 по размерности строки и 6 по размерности столбца.

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;

Поместите исходные и сдвинутые матрицы шаблонов на графический процессор с помощью gpuArray объекты.

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

Вычислите перекрестную корреляцию на графическом процессоре.

cc = xcorr2(offsetTemplate,template);

Верните результат в рабочую область MATLAB ® с помощью gather. Используйте максимальное абсолютное значение перекрестной корреляции, чтобы определить сдвиг и сравнить результат с известным сдвигом.

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

Входные параметры

свернуть все

Входные массивы, заданные как матрицы или gpuArray объекты.

Для получения дополнительной информации об использовании смотрите Run MATLAB Functions on a GPU (Parallel Computing Toolbox) и GPU Support by Release (Parallel Computing Toolbox). xcorr2 с gpuArray (Parallel Computing Toolbox) объекты.

Пример: sin(2*pi*(0:9)'/10)*sin(2*pi*(0:13)/20) задает двумерную синусоидальную поверхность.

Пример: gpuArray(sin(2*pi*(0:9)'/10)*sin(2*pi*(0:13)/20)) задает двумерную синусоидальную поверхность как gpuArray объект.

Типы данных: single | double
Поддержка комплексного числа: Да

Выходные аргументы

свернуть все

2-D перекрестную корреляцию или автокорреляционную матрицу, возвращенную в виде матрицы или gpuArray объект.

Подробнее о

свернуть все

2-D перекрестной корреляции

2-D перекрестная корреляция M -by- N матрицы, X и P -by- Q матрицы, H, является матрицей, C, размера M + P -1 по N + Q -1. Его элементы заданы как

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

где планка над H обозначает комплексное сопряжение.

Выходная матрица C (k,l) имеет отрицательные и положительные индексы строка и столбец.

  • Отрицательный индекс строки соответствует сдвигу вверх строк H.

  • Отрицательный индекс столбца соответствует левому сдвигу столбцов H.

  • Положительный индекс строки соответствует сдвигу вниз строк H.

  • Положительный индекс столбца соответствует сдвигу вправо столбцов H.

Для приведения индексов в MATLAB® форма, добавьте размер H: C элемента (k, l) соответствует C(k+P,l+Q) в рабочей области.

Для примера рассмотрим эту 2-D перекрестной корреляции:

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

The C(1,1) элемент в выходе соответствует C (1-3,1-2 ) = C (-2, -1) в определяющем уравнении, которое использует нулевую индексацию. Чтобы вычислить C(1,1) элемент, сдвиг H две строки вверх и один столбец налево. Соответственно, единственным продуктом в сумме перекрестной корреляции является X(1,1)*H(3,2) = 6. Используя определяющее уравнение, вы получаете

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

со всеми остальными терминами в двойной сумме равной нулю.

Расширенные возможности

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

.

См. также

| |

Представлено до R2006a
Для просмотра документации необходимо авторизоваться на сайте