2D взаимная корреляция
Создайте две матрицы, 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(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
Учитывая матрицу из размера и матрица из размера , их двумерная взаимная корреляция, , матрица размера с элементами
трассировка, и крестик обозначает Эрмитово спряжение. Матрицы и имейте размер и ненулевые элементы, данные
и
Вызов xcorr2
эквивалентно этой процедуре для общих комплексных матриц произвольного размера.
Создайте две комплексных матрицы, из размера и из размера .
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]);
Вычислите элементы цикличным выполнением и сброс обнулять на каждом шаге. Сэкономьте время и память путем подведения итогов продуктов элемента вместо того, чтобы умножить и взять трассировку.
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™. Пошлите к Поддержке графического процессора Релизом (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
a
B
— Входные массивыgpuArray
объектыВходные массивы в виде матриц или gpuArray
объекты.
Смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox) и Поддержка графического процессора Релизом (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))
задает двумерную синусоидальную поверхность как a
объект.gpuArray
Типы данных: single
| double
Поддержка комплексного числа: Да
c
— 2D матрица взаимной корреляции или автокорреляцииgpuArray
объект2D матрица взаимной корреляции или автокорреляции, возвращенная как матрица или gpuArray
объект.
2D взаимная корреляция M-by-N матрица, X и P-by-Q матрица, H, является матрицей, C, размера M +P–1 N +Q–1. Его элементами дают
где панель по 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
. Используя уравнение определения, вы получаете
со всеми другими терминами в двойной равной нулю сумме.
Эта функция полностью поддерживает массивы графического процессора. Для получения дополнительной информации смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox).
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.