plotを使った四分木分割をしたいです。

조회 수: 17 (최근 30일)
koba
koba 2019년 9월 19일
댓글: koba 2019년 9월 20일
例えば点が6個あったとします。
a=[2 2 ;7 2 ; 3 7 ; 6 6 ;8 9 ;8 4]
この点を正方形で囲み四分木分割をしたいのですが、どのようにコードを書いたらいいか分かりません。
追記:四分木分割で正方形が何個も作られますが、その正方形ひとつひとつの座標が知りたいです。

채택된 답변

Akira Agata
Akira Agata 2019년 9월 19일
편집: Akira Agata 2019년 9월 19일
Image Processing Toolboxの関数 qtdecomp を使うのはいかがでしょうか。
以下はその一例です。
% 与えられた(x,y)座標が1(他は0)の16x16配列Iを作成
a = [2 2; 7 2; 3 7; 6 6; 8 9; 8 4];
I = zeros(16,16);
for kk = 1:size(a,1)
I(a(kk,2),a(kk,1)) = 1;
end
% 四分木分割(領域内の合計値が >1 なら分割)
func = @(x) squeeze(sum(sum(x,1),2) > 1);
S = qtdecomp(I,func);
S = full(S);
% 四分木分割の結果からラベル行列を作成
label = zeros(size(S));
[r,c] = find(S);
for kk = 1:numel(r)
n = S(r(kk),c(kk));
label(r(kk):r(kk)+n-1,c(kk):c(kk)+n-1) = kk;
end
% 結果を図示
figure
imagesc(label)
hold on
scatter(a(:,1),a(:,2),'r','filled')
ax = gca;
ax.YDir = 'normal';
  댓글 수: 3
Akira Agata
Akira Agata 2019년 9월 20일
例えば先のプログラムを実行すると、以下のようなlabel配列が得られます。
>> label
label =
1 1 1 1 4 4 7 7 9 9 9 9 9 9 9 9
1 1 1 1 4 4 7 7 9 9 9 9 9 9 9 9
1 1 1 1 5 5 8 8 9 9 9 9 9 9 9 9
1 1 1 1 5 5 8 8 9 9 9 9 9 9 9 9
2 2 2 2 6 6 6 6 9 9 9 9 9 9 9 9
2 2 2 2 6 6 6 6 9 9 9 9 9 9 9 9
2 2 2 2 6 6 6 6 9 9 9 9 9 9 9 9
2 2 2 2 6 6 6 6 9 9 9 9 9 9 9 9
3 3 3 3 3 3 3 3 10 10 10 10 10 10 10 10
3 3 3 3 3 3 3 3 10 10 10 10 10 10 10 10
3 3 3 3 3 3 3 3 10 10 10 10 10 10 10 10
3 3 3 3 3 3 3 3 10 10 10 10 10 10 10 10
3 3 3 3 3 3 3 3 10 10 10 10 10 10 10 10
3 3 3 3 3 3 3 3 10 10 10 10 10 10 10 10
3 3 3 3 3 3 3 3 10 10 10 10 10 10 10 10
3 3 3 3 3 3 3 3 10 10 10 10 10 10 10 10
ここれをもとに以下のようにすると、例えば label = 1 の (x,y) 座標が得られます。
[r,c] = find(label == 1);
>> [r,c]
ans =
1 1
2 1
3 1
4 1
1 2
2 2
3 2
4 2
1 3
2 3
3 3
4 3
1 4
2 4
3 4
4 4
koba
koba 2019년 9월 20일
素早い回答ありがとうございます。助かりました。

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

추가 답변 (0개)

제품


릴리스

R2019a

Community Treasure Hunt

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

Start Hunting!