【问题标题】:Cross-Correlation between two images两个图像之间的互相关
【发布时间】:2014-04-11 18:05:06
【问题描述】:

如何在一张图像上选择一个随机点,然后使用互相关在另一张图像上找到它的对应点?

所以基本上我有 image1,我想(自动)在其上选择一个点,然后在 image2 上找到其对应/相似的点。

以下是一些示例图片:

全图:

补丁:

互相关结果:

【问题讨论】:

  • 如果您对两张(相似)图像进行互相关,峰值应该对应于两张图像的相对偏移量。
  • 您是在寻找 SIFTSURF 之类的东西,还是特别想使用互相关?这两张图片在比例、旋转、光照、视角等方面有何关联?
  • @OliCharlesworth 是的,必须是互相关的,它们有一些重叠。如果可能的话,我想得到 4 分,并希望它们尽可能分开。我尝试过类似 C_1 = normxcorr2(image1, image2);但是 C_1 改变大小然后你不能得到 image1 和 2 上的实际点
  • @mbschenkel 是的,必须是互相关的,它们有一些重叠。
  • 那么xcorr2有什么问题?

标签: image matlab image-processing


【解决方案1】:

嗯,xcorr2 本质上可以看作是分析所有可能的正向和负向变化,并衡量它们与每个变化的匹配程度。因此,对于大小为N x N 的图像,结果的大小必须为(2*N-1) x (2*N-1),如果两个图像相等或不偏移,则索引[N, N] 处的相关性将是最大的。如果将它们移动 10 个像素,则最大相关性将在 [N-10, N] 处,依此类推。因此,您需要减去 N 以获得绝对偏移。

使用您的实际代码可能会更容易提供帮助。但是让我们看一个例子:

(A) 我们读取一个图像并选择两个不同的子图像,偏移量为 da 和 db

Orig = imread('rice.png');
N = 200; range = 1:N;
da = [0 20];
db = [30 30];
A=Orig(da(1) + range, da(2) + range);
B=Orig(db(1) + range, db(2) + range);

(b) 计算互相关并找到最大值

X = normxcorr2(A, B);
m = max(X(:));
[i,j] = find(X == m);

(C) 使用恢复的班次将它们拼凑在一起

R = zeros(2*N, 2*N);
R(N + range, N + range) = B;
R(i + range, j + range) = A;

(D) 说明事物

figure
subplot(2,2,1), imagesc(A)
subplot(2,2,2), imagesc(B)
subplot(2,2,3), imagesc(X)
rectangle('Position', [j-1 i-1 2 2]), line([N j], [N i])
subplot(2,2,4), imagesc(R);

(E) 比较有意换档和恢复换档

delta_orig = da - db
%--> [30 10]
delta_recovered = [i - N, j - N]
%--> [30 10]

正如您在 (E) 中看到的,我们得到了我们在 (A) 中有意引入的转变。


或根据您的情况进行调整:

full=rgb2gray(imread('a.jpg'));
template=rgb2gray(imread('b.jpg'));
S_full = size(full);
S_temp = size(template);

X=normxcorr2(template, full);
m=max(X(:));
[i,j]=find(X==m);

figure, colormap gray
subplot(2,2,1), title('full'), imagesc(full)
subplot(2,2,2), title('template'), imagesc(template), 
subplot(2,2,3), imagesc(X), rectangle('Position', [j-20 i-20 40 40])

R = zeros(S_temp);
shift_a = [0 0];
shift_b = [i j] - S_temp;
R((1:S_full(1))+shift_a(1), (1:S_full(2))+shift_a(2)) = full;
R((1:S_temp(1))+shift_b(1), (1:S_temp(2))+shift_b(2)) = template;
subplot(2,2,4), imagesc(R);

但是,要使此方法正常工作,补丁 (template) 和完整图像应缩放到相同的分辨率。


更详细的例子也可以在here找到。

【讨论】:

  • 感谢 imgray = rgb2gray(image); imgray2 = rgb2gray(image2);模板 = imgray(200:600,540:end); C_1 = normxcorr2(模板,imgray); C_2 = normxcorr2(模板,imgray2); [y1, x1] = find(C_1 == max(abs(C_1(:)))); [y2, x2] = find(C_2 == max(abs(C_2(:))));所以这里我取了 C_1 和 C_2 的最高点,但它们不是 image1 和 image2 上的实际点,正如你所说我需要减去,所以我减去了模板大小但仍然不会给我正确的点?
  • 好的,所以你正在为总共 3 张可能不同大小的图像执行此操作。但是应该可以同时查看其中两个(ìmgraytemplate 在您的情况下)。也许向我们展示确切的图像以更好地理解问题会有所帮助。如果您查看normxcorr2 的输出,您是否看到一个清晰的峰值?如果有,在哪里?
  • 我不知道如何将图像发布到这里,但是是的,我得到了一个清晰的亮点(峰值),所以我想获取这个亮点(峰值)的坐标并将其绘制在实际图像(在我的情况下为 imgray)图像为 1728by2300,模板为 1250by955
  • 然后那个“点”的坐标减去template 的大小就可以得到imgray 的坐标,反之亦然。我建议您从我的回答中的已知偏移量开始,这样您就知道会发生什么。您可以上传图片,例如here 并在您的问题中链接到它们。声望越高,您也可以直接上传。
  • 是的,我已经做到了,减去了模板大小,但不知何故它没有在正确的位置绘制。这是图片的链接imgur.com/a/9M14y/all
猜你喜欢
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2014-02-27
  • 2021-03-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
相关资源
最近更新 更多