xcorr2

2D взаимная корреляция

Синтаксис

c = xcorr2(a,b)
c = xcorr2(a)

Описание

пример

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) (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.4648e-14

Ответ совпадает, чтобы обработать точность машинным способом с выводом xcorr2.

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

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

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

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

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

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

Используйте 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')

Поместите меньшее изображение в увеличенном изображении. Вращайте меньшее изображение, чтобы выполнить соглашение, которое 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

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

Создайте шаблон в 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

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

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™. Пошлите к Поддержке графического процессора Релизом (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.

Смотрите функции MATLAB Выполнения на графическом процессоре (Parallel Computing Toolbox) и Поддержка графического процессора Релизом (Parallel Computing Toolbox) для получения дополнительной информации об использовании 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
Поддержка комплексного числа: Да

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

свернуть все

2D матрица взаимной корреляции или автокорреляции, возвращенная как матрица или объект gpuArray.

Больше о

свернуть все

2D Взаимная корреляция

2D взаимная корреляция 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) в рабочей области.

Например, рассмотрите эту 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

Элемент 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++ с помощью MATLAB® Coder™.

Смотрите также

| |

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

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