
plotを使った四分木分割をしたいです。
15 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
例えば点が6個あったとします。
a=[2 2 ;7 2 ; 3 7 ; 6 6 ;8 9 ;8 4]
この点を正方形で囲み四分木分割をしたいのですが、どのようにコードを書いたらいいか分かりません。
追記:四分木分割で正方形が何個も作られますが、その正方形ひとつひとつの座標が知りたいです。
0 Kommentare
Akzeptierte Antwort
Akira Agata
am 19 Sep. 2019
Bearbeitet: Akira Agata
am 19 Sep. 2019
以下はその一例です。
% 与えられた(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 Kommentare
Akira Agata
am 20 Sep. 2019
例えば先のプログラムを実行すると、以下のような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
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu オブジェクト解析 finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!