2-D взаимная корреляция
Создайте две матрицы, 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(3,5) в MATLAB ®, сM2 3 на 3). Выстроить две матрицы так, чтобы их (1,1) элементы совпадают. Это размещение соответствует . Чтобы найти , слайд M2 два ряда справа.

Сейчас M2 находится в верхней части матрицы M1(1:3,3:5). Вычислите поэлементные произведения и суммируйте их. Ответ должен быть
[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
Учитывая матрицу размера N и H × Q, их двумерная C=X⋆H, является матрицей (N + Q-1) с элементами
1≤k≤M+P-1,1≤l≤N+Q-1.
- след, а кинжал обозначает эрмитово сопряжение. Матрицы и имеют размер 2 (Q-1)) и ненулевые элементы, задаваемые
P≤m≤M+P-1,Q≤n≤N+Q-1
и
k≤p≤P+k-1,l≤q≤Q+l-1.
Запрос xcorr2 эквивалентно этой процедуре для общих комплексных матриц произвольного размера.
Создайте две комплексные матрицы, размера 22 H × 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;
Инициализация и .
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]);
Вычислите элементы путем закольцовывания через и l. Сброс до нуля на каждом шаге. Экономьте время и память, суммируя произведения элементов вместо умножения и взятия следа.
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')

Выберите прямоугольное сечение изображения. Отображение изображения большего размера с отсутствующим разделом.
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™. Сведения о поддерживаемых графических процессорах см. в документе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений).
Сдвиньте шаблон на известную величину и восстановите сдвиг с помощью взаимной корреляции.
Создайте шаблон в матрице 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
a, b - Входные массивыgpuArray объектыВходные массивы, указанные как матрицы или 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
Поддержка комплексного номера: Да
c - 2-D матрица взаимной корреляции или автокорреляцииgpuArray объект2-D матрица взаимной корреляции или автокорреляции, возвращаемая как матрица или gpuArray объект.
2-D Взаимная корреляция матрицы M-на-N, X, и матрицы P-на-Q, H, является матрицей C размера M + P-1 на N + Q-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. С помощью определяющего уравнения получается
H w (2,1) = 1 × 6 = 6,
со всеми остальными членами в двойной сумме, равной нулю.
Эта функция полностью поддерживает массивы графических процессоров. Дополнительные сведения см. в разделе Запуск функций MATLAB на графическом процессоре (панель инструментов параллельных вычислений).
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.