4

我有两个想要合并在一起的掩码,mask1mask2除非mask2有一个零覆盖。掩码不是二进制的,它们是用户在感兴趣区域中定义的某个值,在其他地方为 0。

例如,如果:

mask1=[0 5 5;0 5 5];
mask2=[4 4 0;4 4 0];

那么我想要一个输出[4 4 5;4 4 5]。如果我有另一个面具,

mask3=[0 6 0;0 6 0];  

那么我想要一个输出[4 6 5;4 6 5]

必须有一种简单的方法来做到这一点,而无需遍历和比较矩阵中的每个元素。时间很重要,因为矩阵很大,我需要合并很多。任何帮助都会很棒。

4

4 回答 4

5

另一种选择是使用逻辑索引

%# Define masks:

mask1 = [0 5 5; 0 5 5];
mask2 = [4 4 0; 4 4 0];
mask3 = [0 6 0; 0 6 0];

%# Merge masks:

newMask = mask1;                %# Start with mask1
index = (mask2 ~= 0);           %# Logical index: ones where mask2 is nonzero
newMask(index) = mask2(index);  %# Overwrite with nonzero values of mask2
index = (mask3 ~= 0);           %# Logical index: ones where mask3 is nonzero
newMask(index) = mask3(index);  %# Overwrite with nonzero values of mask3
于 2009-11-21T17:44:47.300 回答
5

快速测试

mask2+mask1.*(mask2==0)

对于您的第一个输出,我将让您概括解决方案

于 2009-11-21T16:42:54.647 回答
2
mask1=[0 5 5;0 5 5];
mask2=[4 4 0;4 4 0];

idx = find(mask2==0);    %# find zero elements in mask2
mask2(idx) = mask1(idx)  %# replace them with corresponding mask1 elmenets

mask3=[0 6 0;0 6 0];
idx = find(mask3==0);    %# find zero elements in mask3
mask3(idx) = mask2(idx)  %# replace them with corresponding mask2 elmenets
于 2009-11-21T17:38:11.823 回答
0

如果掩码是二进制的,你可以这样做:

result = mask1;
result(mask2 ~= 0) = true;
% and you can add many masks as you want to the resultant mask.
% result(maskn ~= 0) = true;

如果它们不是二进制@gnovice 答案是完美的。

于 2019-09-27T06:53:29.657 回答