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

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

Akzeptierte Antwort

Akira Agata
Akira Agata am 19 Sep. 2019
Bearbeitet: Akira Agata am 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 Kommentare
Akira Agata
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
koba
koba am 20 Sep. 2019
素早い回答ありがとうございます。助かりました。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Produkte


Version

R2019a

Community Treasure Hunt

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

Start Hunting!