How to convert 3D matrix to 1D?

조회 수: 155 (최근 30일)
Tan Wen Kun
Tan Wen Kun 2015년 12월 3일
편집: Guillaume 2015년 12월 4일
I got a color image and store into a variable A.
A =
(22,10,10) (22,10,10) (39,40,50)
(89,11,14) (23,11,11) (99,10,10)
(89,11,14) (69,10,10) (99,10,10)
x=1 when loop horizontally I wish to register the first color I seem and label it into x.
when loop same color then label it into same label.
when new color is seem then register the color and label into x+1.
I wish to get a table like
color label
(22,10,10) 1
(39,40,50) 2
(89,11,14) 3
(23,11,11) 4
(99,10,10) 5
(69,10,10) 6
so result finally get is
B=
1 1 2
3 4 5
3 6 5
How to get the label table and how to get the result?
  댓글 수: 2
Walter Roberson
Walter Roberson 2015년 12월 3일
편집: Walter Roberson 2015년 12월 3일
What data type is A? The notation you use is not MATLAB syntax, and
A = {
[22,10,10], [22,10,10], [39,40,50];
[89,11,14], [23,11,11], [99,10,10];
[89,11,14], [69,10,10], [99,10,10] }
would not be a 3D matrix.
Tan Wen Kun
Tan Wen Kun 2015년 12월 3일
편집: Tan Wen Kun 2015년 12월 3일
I should say I got a 3D image.
I got a color image like this so what I want to do is loop horizontal and label the color seem and register it.
I just show my problem in a simple form to see.
so I did not use
A(:,:,1) =
22 22 39
89 23 99
89 69 99
A(:,:,2)=
10 10 40
11 11 10
11 10 10
A(:,:,3)=
10 10 50
14 11 10
14 10 10

댓글을 달려면 로그인하십시오.

채택된 답변

Guillaume
Guillaume 2015년 12월 3일
The way to do this is to reshape your image into an nx3 matrix where each row correspond to the three colours of a pixel. You can then apply unique with the 'rows' option on this to get your labels. It's then just a matter of reshaping the output.
Note that doing the scanning by rows rather than by columns complicate the code somewhat.
Also, please, post valid matlab code rather than leaving it to us to generate valid matrix
A = cat(3, [22 22 39;89 23 99; 89 69 99], ... it would have been great
[10 10 40; 11 11 10; 11 10 10], ... if I could just have
[10 10 50; 14 11 10; 14 10 10]) %copy/pasted that from your question
[~, ~, labels] = unique(reshape(permute(A, [2 1 3]), [], 3), 'rows', 'stable');
B = reshape(labels, size(A, 2), size(A, 1))'
The same code if you do the labeling by column:
[~, ~, labels] = unique(reshape(A, [], 3), 'rows', 'stable'); %no need to transpose anymore
B = reshape(labels, size(A, 1), size(A, 2)) %no need to transpose either.

추가 답변 (1개)

Walter Roberson
Walter Roberson 2015년 12월 3일
If you do not need the labels to start from 1 at the upper left, then
[color, ~, idx] = unique(reshape(A, [], 3), 'rows');
B = reshape(idx, size(A,1), size(A,2));
  댓글 수: 9
Tan Wen Kun
Tan Wen Kun 2015년 12월 3일
Is that other method can do like stable? I hope to get 1 at upper left
Columns 1 through 10
152 152 152 152 152 152 152 152 152 152
Columns 11 through 20
152 152 152 152 152 152 152 152 152 152
Columns 21 through 30
152 152 152 152 152 152 152 152 152 152
Guillaume
Guillaume 2015년 12월 3일
Without 'stable', it's not possible to have a row or column ordering of labels with unique. You would have to use sort with the stable option (I'm fairly certain that did exist in 2011b) and the find the duplicate yourself. It's possible but it's worthy of a question in itself.
As for your new question, please start a new question as it is barely related to the current one. When you ask the question, please explain clearly what your definition of connected is. In your above example, I consider 4 and 5 to be connected orthogonally, and 3 and 5 to be connected diagonally.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by