2009-11-21 14 views
4

J'ai deux masques que je voudrais fusionner ensemble, en écrasant mask1 avec mask2 à moins que mask2 ait un zéro. Les masques ne sont pas binaires, ils ont une valeur définie par l'utilisateur dans la région d'intérêt et 0 ailleurs.Comment fusionner deux masques ensemble dans MATLAB?

Par exemple, si:

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

alors je veux une sortie de [4 4 5;4 4 5]. Et si je puis eu un autre masque,

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

alors je veux une sortie de [4 6 5;4 6 5]

Il se doit d'être un moyen facile de faire cela sans passer par la comparaison et chaque élément dans les matrices. Le timing est important car les matrices sont assez grandes et j'ai besoin de fusionner beaucoup d'entre elles. Toute aide est la bienvenue.

Répondre

5

Testée rapidement

mask2+mask1.*(mask2==0) 

pour votre première sortie, je vous laisse à généraliser la solution

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 
+0

Il est beaucoup plus rapide utiliser l'indexation logique plutôt que d'utiliser la fonction de recherche ... –

+0

True. @gnovice a ajouté que, je l'ai gardé comme une solution alternative – Amro

4

Une autre option consiste à utiliser logical indexing:

%# 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 
+1

"% #" est un pragma dans Matlab. Je reçois des avertissements de "Pragma de compilateur non reconnu" avec ceci. –

+0

@Andrew: '%' crée un commentaire, donc rien après il devrait être évalué du tout. Le "#" est juste là pour que la couleur des commentaires sur SO soit meilleure. – gnovice

+1

@Andrew: Je ne savais pas que .. Apparemment, il y a quelques pragmas: http://blogs.mathworks.com/desktop/2008/09/22/matlab-pragmas/ – Amro