比较两个像素值数组,并存储任何匹配项

时间:2015-12-23 16:11:34

标签: arrays matlab image-processing

我想比较两个图像的像素值,这些图像存储在数组中。

假设数组是AB。我想逐个比较元素,如果是A[l] == B[k],那么我想将匹配作为键值对存储在第三个数组C中,如下所示:C[l] = k

由于阵列自然非常大,因此解决方案需要在Core 2 Duo系统上的合理时间(分钟)内完成。

3 个答案:

答案 0 :(得分:1)

这似乎适用于1024*720矩阵的一秒钟:

A = randi(255,737280,1);
B = randi(255,737280,1);
C = zeros(size(A));

[b_vals, b_inds] = unique(B,'first');
for l = 1:numel(b_vals)
   C(A == b_vals(l)) = b_inds(l);
end

首先,我们找到B的唯一值以及这些值的第一次出现的索引。

[b_vals, b_inds] = unique(B,'first');

我们知道uint8数组中的唯一值不超过256个,因此我们将循环从1024*720迭代减少到仅256迭代。

我们也知道,对于特定值的每次出现,例如209,在A中,C中的所有位置都将具有相同的值:第一次出现的位置209中的B,我们可以立即设置所有这些内容。首先,我们获取b_vals(l)中所有A次出现的位置:

A == b_vals(l)

然后将该掩码用作C的逻辑索引。

C(A == b_vals(l))

所有这些值都等于B中的相应索引:

   C(A == b_vals(l)) = b_inds(l);

以下是考虑<{1}}中值所有的更新代码(或者至少是必要的数量)。如果B中出现的值多于A中的值,则索引将换行。

B

我还没有完全测试过这段代码,但从我的小样本看来它似乎工作正常,在全尺寸的情况下,它只需要前一代码的两倍,或者在我的机器上不到2秒

答案 1 :(得分:0)

所以,如果我正确理解你的问题,你想要l = 1的每个值:长度(A)将(第一个)索引k变成B,以便A(l) == B(k)。然后:

C = arrayfun(@(val) find(B==val, 1, 'first'), A)

可以为您提供解决方案,只要您确定每个元素都匹配即可。否则上述解决方案将失败,抱怨该函数返回非标量(因为如果未找到匹配,则find将返回[])。您有两种选择:

  • 使用单元格数组存储结果而不是数字数组。您需要在最后使用'UniformOutput', false调用arrayfun。然后,B中没有匹配的A的值将是isempty(C{i})为真的那些。
  • 将索引的默认值提供给A,而B中没有匹配(例如0或NaN)。我不确定这个,但我认为你需要在arrayfun调用中添加'ErrorHandler', @(~,~) NaN。错误处理程序是在传递给arrayfun的函数失败时被调用的函数,可能会重新抛出错误或计算替换值。因此@(~,~) NaN。但是,我不确定它是否会起作用,因为在这种情况下错误是在arrayfun中而不是在传递的函数中,但是你可以尝试它。

答案 2 :(得分:-1)

如果你有阵列A和A的图像乙

idx = A == B;
C = zeros(size(A));
C(idx) = A(idx);