slicing an M-by-N-by-3 matrix using an M-by-N matrix of logical values

6 Ansichten (letzte 30 Tage)
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?

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 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 Kommentare
Luca Amerio
Luca Amerio am 12 Apr. 2018
The first one is nice, but the second one is great!
Nice one, thank you!
Walter Roberson
Walter Roberson am 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;

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

dpb
dpb am 12 Apr. 2018
A=0.5*(A.*i+C.*i);

Kategorien

Mehr zu Resizing and Reshaping Matrices finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by