我想比较两个图像的像素值,这些图像存储在数组中。
假设数组是A
和B
。我想逐个比较元素,如果是A[l] == B[k]
,那么我想将匹配作为键值对存储在第三个数组C
中,如下所示:C[l] = k
由于阵列自然非常大,因此解决方案需要在Core 2 Duo系统上的合理时间(分钟)内完成。
答案 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})
为真的那些。'ErrorHandler', @(~,~) NaN
。错误处理程序是在传递给arrayfun的函数失败时被调用的函数,可能会重新抛出错误或计算替换值。因此@(~,~) NaN
。但是,我不确定它是否会起作用,因为在这种情况下错误是在arrayfun中而不是在传递的函数中,但是你可以尝试它。答案 2 :(得分:-1)
如果你有阵列A和A的图像乙
idx = A == B;
C = zeros(size(A));
C(idx) = A(idx);