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

17 vues (au cours des 30 derniers jours)
koba
koba le 19 Sep 2019
Commenté : koba le 20 Sep 2019
例えば点が6個あったとします。
a=[2 2 ;7 2 ; 3 7 ; 6 6 ;8 9 ;8 4]
この点を正方形で囲み四分木分割をしたいのですが、どのようにコードを書いたらいいか分かりません。
追記:四分木分割で正方形が何個も作られますが、その正方形ひとつひとつの座標が知りたいです。

Réponse acceptée

Akira Agata
Akira Agata le 19 Sep 2019
Modifié(e) : Akira Agata le 19 Sep 2019
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 commentaires
Akira Agata
Akira Agata le 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
koba
koba le 20 Sep 2019
素早い回答ありがとうございます。助かりました。

Connectez-vous pour commenter.

Plus de réponses (0)

Produits


Version

R2019a

Community Treasure Hunt

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

Start Hunting!