Extract specific data from 3D matrix

45 Ansichten (letzte 30 Tage)
Jan Kubicek
Jan Kubicek am 30 Jan. 2021
Kommentiert: Jan Kubicek am 31 Jan. 2021
I would like to kindly ask you for the help with the issue of extracting specific values from 3D matrix. I have the variable A(10,10,3) containing the elements 1, 2, 3, and the second variable B(10,10,3) containing pixel values. I need to extract and store the elements from each layer of B which are in the same position as elements 1 from A. Thus, these values should be stored in a cell array (it should contain 3 cells). I was able to perform this task for one 2D matrix, but in the case of 3D matrix I am not able to do that. I would like to kindly ask you for help.

Antworten (2)

Iuliu Ardelean
Iuliu Ardelean am 30 Jan. 2021
size = 10;
A = randi(3, [size size 3]); % matrix containing elements 1, 2 and 3
B = randi(255, [size size 3]); % RGB matrix
[row, col] = find(A==1);
% I wasn't sure if you wanted to extract only one of R, G, or B,
% OR you wanted to extract all three R, G, and B at a same time...
% so option 1: if you want to extract only one of R, G, and B at a time:
pixel_values = zeros(size, size, 3);
pixel_values(A==1) = B(A==1)
% and option 2: if you want to extract all three R, G, and B at the same time:
pixel_values = zeros(size, size, 3);
col = mod(col,size); % this is because find returns linear indices if matrix is multidimensional
col(col == 0) = size;
pixel_values(row, col, :) = B(row, col, :)
  1 Kommentar
Jan Kubicek
Jan Kubicek am 30 Jan. 2021
Thank you very much for the reaction. It is a nice approach. Nevertheless, I need to get only arrays of the pixels from each layer of B in the same positions as A==1 . I am using the first option, I tried to make a cell array, containg only these pixels, but it probably does not work well, please can you help me with that:
for i=1:3
pix{i}=pixel_values(pixel_values(:,:,i)>0);
end
My task is I need to compute histogram of the pixel values from each layer of the matrix B.
Thank you very much.

Melden Sie sich an, um zu kommentieren.


Walter Roberson
Walter Roberson am 31 Jan. 2021
A = randi(4, 5,5,3)
A =
A(:,:,1) = 2 3 4 4 1 2 4 1 3 2 3 2 3 4 4 1 4 4 1 1 4 3 4 2 1 A(:,:,2) = 3 4 1 3 3 2 4 4 4 3 4 1 1 2 3 2 3 3 2 3 3 2 1 2 4 A(:,:,3) = 3 3 4 3 1 3 2 3 1 1 2 2 2 3 1 3 4 1 3 2 1 1 2 3 4
B = randi(9, 5,5,3)
B =
B(:,:,1) = 9 5 4 9 4 1 9 8 9 1 9 7 7 9 9 6 4 9 3 6 1 1 3 2 2 B(:,:,2) = 8 1 4 7 9 6 1 2 9 1 2 7 2 1 7 2 5 4 8 4 9 6 6 5 4 B(:,:,3) = 5 9 2 8 3 3 7 1 8 5 7 2 1 6 7 2 5 9 1 4 9 3 4 1 1
idx = find(A==1);
temp = B(idx);
[R,C,P] = ind2sub(size(A),idx);
pix = arrayfun(@(p) temp(P==p).', 1:max(P), 'uniform', 0);
celldisp(pix)
pix{1} = 6 8 3 4 6 2 pix{2} = 7 4 2 6 pix{3} = 9 3 9 8 3 5 7
  2 Kommentare
Walter Roberson
Walter Roberson am 31 Jan. 2021
A = randi(4, 5,5,3)
A =
A(:,:,1) = 4 1 1 1 4 3 4 2 3 3 3 2 3 2 4 4 4 2 1 1 2 3 1 2 4 A(:,:,2) = 4 4 3 3 1 4 2 4 3 3 4 4 3 2 2 3 1 2 3 1 1 2 1 1 3 A(:,:,3) = 4 1 4 1 1 3 4 1 4 2 2 1 4 4 1 3 2 4 1 3 1 2 1 4 2
B = randi(9, 5,5,3)
B =
B(:,:,1) = 6 9 1 1 1 1 7 5 7 5 3 3 2 2 6 3 1 7 4 3 8 2 8 4 7 B(:,:,2) = 3 5 2 8 4 7 6 6 1 8 7 3 4 4 3 3 2 9 1 9 8 8 8 4 3 B(:,:,3) = 9 8 8 4 2 4 6 5 5 9 9 7 1 7 7 2 1 6 4 9 6 2 1 2 5
SELECT = @(M,W) M(W);
pix = arrayfun(@(p) SELECT(B(:,:,p), A(:,:,p)==1).', 1:size(A,3), 'uniform', 0);
celldisp(pix)
pix{1} = 9 1 8 1 4 3 pix{2} = 8 2 8 4 4 9 pix{3} = 6 8 7 5 1 4 4 2 7
Jan Kubicek
Jan Kubicek am 31 Jan. 2021
I would like to kindly thank you very much for your contributions, they work very well :-)

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

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

Start Hunting!

Translated by