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