slicing an M-by-N-by-3 matrix using an M-by-N matrix of logical values
    8 views (last 30 days)
  
       Show older comments
    
    Luca Amerio
      
 on 11 Apr 2018
  
    
    
    
    
    Commented: Walter Roberson
      
      
 on 12 Apr 2018
            Hi everybody
I have an RGB image as a MxNx3 matrix.
I would like to slice it using an MxN matrix of logic values (one for each pixel) and add a 1x1x3 value to those pixels. I'm trying to a clean way to do it.
In other words, I'm trying to do something like this
A = rand(200,200,3);
i = rand(200,200) > 0.5;
C = cat(3,0.3,0.4,0.2);
A(i) = 0.5*A(i,:) + 0.5*C; %doesn't work!
The only ways I found is either "unpacking" each MxN submatrix to a new variable like this
R = A(:,:,1);
G = A(:,:,2);
B = A(:,:,3);
R(i) = 0.5*R(i) + 0.5*C(1);
G(i) = 0.5*G(i) + 0.5*C(2);
B(i) = 0.5*B(i) + 0.5*C(3);
Anyone got a better idea?
0 Comments
Accepted Answer
  Walter Roberson
      
      
 on 12 Apr 2018
        A = A + repmat(i, [1, 1, 3]) .* repmat(C, [size(A,1), size(A,2), 1]);
Since R2016b this can be expressed as
 A = A + i .* C;
2 Comments
  Walter Roberson
      
      
 on 12 Apr 2018
				dpb's Answer takes into account the selective 1/2 where mine does not. The fix would be
A = A + (C - A)/2 *.i;
More Answers (1)
  dpb
      
      
 on 12 Apr 2018
        A=0.5*(A.*i+C.*i);
1 Comment
  Walter Roberson
      
      
 on 12 Apr 2018
				Note that this requires R2016b or later due to differences in the sizes of the objects.
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

