xcorr2
R2026b二维互相关性
描述
示例
创建两个矩阵 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。用滞后表示,所得矩阵为
例如,计算元素 (或 MATLAB® 中的 C(3,5),因为 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; tiledlayout("horizontal") nexttile imagesc(kimg) axis image off colormap gray title("Image") nexttile 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)以了解支持哪些 GPU。
将模板偏移已知量,并使用互相关性还原该偏移。
在 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 对象将原始模板矩阵和偏移后的模板矩阵放到您的 GPU 上。
template = gpuArray(template); offsetTemplate = gpuArray(offsetTemplate);
在 GPU 上计算互相关性。
cc = xcorr2(offsetTemplate,template);
使用 gather 将结果返回到 MATLAB® 工作区。使用互相关性的最大绝对值确定偏移,并将结果与已知偏移进行比较。
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
输入参数
输入数组,指定为矩阵。
示例: sin(2*pi*(0:9)'/10)*sin(2*pi*(0:13)/20) 指定二维正弦曲面。
数据类型: single | double
复数支持: 是
输出参量
二维互相关性或自相关矩阵,以矩阵形式返回。
详细信息
M×N 矩阵 X 与 P×Q 矩阵 H 的二维互相关性是大小为 M+P–1×N+Q–1 的矩阵 C。其元素由下式给出
其中 H 上方的横线表示复共轭。
输出矩阵 C(k,l) 具有负和正的行索引和列索引。
负行索引对应于 H 的行向上偏移。
负列索引对应于 H 的列向左偏移。
正行索引对应于 H 的行向下偏移。
正列索引对应于 H 的列向右偏移。
要将这些索引转换为 MATLAB® 形式,请加上 H 的大小:元素 C(k,l) 对应于工作区中的 C(k+P,l+Q)。
例如,假设有以下二维互相关性:
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),该方程使用从 0 开始的索引。要计算 C(1,1) 元素,将 H 上移两行并左移一列。因此,互相关性和中的唯一乘积是 X(1,1)*H(3,2) = 6。使用定义方程,您得到
其中双精度值和中的所有其他项都等于零。
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。
xcorr2 函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
此函数完全支持 GPU 数组。有关详细信息,请参阅在 GPU 上运行 MATLAB 函数 (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出您可以在基于线程的环境中使用 xcorr2。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)