exponenta event banner

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,3c-2,4c-1, -2c-1, -1c-1,1c-1,2c-1,3c-1,4c0, -2c0, -1c0,0c0,2c0,3c0,4c1, -2c1

В качестве примера вычислите элемент 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=X⋆H, является матрицей размера (M + P-1) × (N + Q-1) с элементами

C (k, l) =Tr{X∼H∼kl } 1≤k≤M+P-1,1≤l≤N+Q-1.

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

X~ (m, n) = X (m-P + 1, n-Q + 1), P≤m≤M+P-1,Q≤n≤N+Q-1

и

H~kl (p, q) = H (p-k + 1, q-l + 1), k≤p≤P+k-1,l≤q≤Q+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. Сброс H∼kl до нуля на каждом шаге. Экономьте время и память, суммируя произведения элементов вместо умножения и взятия следа.

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™. Сведения о поддерживаемых графических процессорах см. в документе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений).

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

Создайте шаблон в матрице 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);

Вычислите взаимную корреляцию на GPU.

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 объекты.

Для получения дополнительной информации об использовании см. раздел Запуск функций MATLAB на графическом процессоре (панель параллельных вычислений) и Поддержка графического процессора по выпуску (панель параллельных вычислений) xcorr2 с gpuArray(Панель инструментов параллельных вычислений).

Пример: 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-на-N, X, и матрицы P-на-Q, H, является матрицей C размера M + P-1 на N + Q-1. Его элементы даны

C (k, l) =∑m=0M−1∑n=0N−1X (m, n) H (m k, n l), (P 1) ≤k≤M−1,− (Q − 1) ≤l≤N−1,

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

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

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

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

  • Положительный индекс строки соответствует нисходящему сдвигу строк Н.

  • Положительный индекс столбца соответствует смещению столбцов Н. вправо.

Для приведения индексов в виде 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

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=01∑n=02X (m, n) H w (m + 2, n + 1) = X (0,0) H w (2,1) = 1 × 6 = 6,

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

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.

См. также

| |

Представлен до R2006a