slicing an M-by-N-by-3 matrix using an M-by-N matrix of logical values
6 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Walter Roberson
2018-4-12
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 个评论
Walter Roberson
2018-4-12
dpb's Answer takes into account the selective 1/2 where mine does not. The fix would be
A = A + (C - A)/2 *.i;
更多回答(1 个)
dpb
2018-4-12
A=0.5*(A.*i+C.*i);
1 个评论
Walter Roberson
2018-4-12
Note that this requires R2016b or later due to differences in the sizes of the objects.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Resizing and Reshaping Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!