Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

qtdecomp

説明

S = qtdecomp(I) は、グレースケール イメージ I に対して四分木分割を行い、スパース行列 S に四分木構造を返します。既定の設定では、qtdecomp は、ブロックのすべての要素が等しくない限り、ブロックを分割します。

S = qtdecomp(I,threshold) は、ブロック要素の最大値からブロック要素の最小値を引いた差が threshold よりも大きい場合にブロックを分割します。

S = qtdecomp(I,threshold,mindim) は、得られたブロックがしきい値の条件を満たしていない場合でも、mindim より小さなブロックを生成しません。

S = qtdecomp(I,threshold,[mindim maxdim]) は、mindim より小さなブロックや maxdim より大きなブロックを生成しません。maxdim より大きなブロックは、しきい値の条件が満たされていても分割されます。

S = qtdecomp(I,fun) は関数 fun を使用して、ブロックを分割するかどうかを決定します。

すべて折りたたむ

小さいサンプル行列を作成します。

I = uint8([1 1 1 1 2 3 6 6;...
             1 1 2 1 4 5 6 8;...
             1 1 1 1 7 7 7 7;... 
             1 1 1 1 6 6 5 5;... 
             20 22 20 22 1 2 3 4;... 
             20 22 22 20 5 4 7 8;... 
             20 22 20 20 9 12 40 12;...
             20 22 20 20 13 14 15 16]);

四分木分割を実行して結果を表示します。

S = qtdecomp(I,.05);
disp(full(S));
     4     0     0     0     4     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     4     0     0     0     2     0     2     0
     0     0     0     0     0     0     0     0
     0     0     0     0     2     0     1     1
     0     0     0     0     0     0     1     1

イメージをワークスペースに読み取ります。

I = imread('liftingbody.png');

四分木分割を実行してブロック表現を Figure に表示します。

S = qtdecomp(I,.27);
blocks = repmat(uint8(0),size(S));

for dim = [512 256 128 64 32 16 8 4 2 1];    
  numblocks = length(find(S==dim));    
  if (numblocks > 0)        
    values = repmat(uint8(1),[dim dim numblocks]);
    values(2:dim,2:dim,:) = 0;
    blocks = qtsetblk(blocks,S,dim,values);
  end
end

blocks(end,1:end) = 1;
blocks(1:end,end) = 1;

imshow(I)

Figure contains an axes. The axes contains an object of type image.

figure
imshow(blocks,[])

Figure contains an axes. The axes contains an object of type image.

入力引数

すべて折りたたむ

グレースケール イメージ。m 行 n 列の数値行列として指定します。関数ハンドル fun が含まれている構文では、関数によってサポートされている任意のクラスをイメージに使用できます。

データ型: single | double | int16 | uint8 | uint16 | logical

ブロックの均一性のしきい値。[0, 1] の範囲内のスカラーとして指定します。

  • I がクラス uint8 である場合、qtdecomp は、実際に使用するしきい値を決めるために threshold の値を 255 倍します。

  • I がクラス uint8 である場合、qtdecomp は、実際に使用するしきい値を決めるために threshold の値を 65535 倍します。

最小ブロック サイズ。正の整数として指定します。mindim はイメージ サイズの因数でなければなりません。

最大ブロック サイズ。正の整数として指定します。maxdim/mindim は 2 のべき乗でなければなりません。

関数ハンドル。ハンドルとして指定します。この関数は、m x m x k の配列にスタックされたすべての m 行 m 列のブロックを入力として受け入れなければなりません。配列内の k はブロック数です。この関数は logical の k 要素ベクトルを返さなければなりません。その値は対応するブロックを分割する場合は 1 で、その他の場合は 0 です。たとえば、k(3) が 0 の場合、3 番目の m 行 m 列のブロックは分割されません。

関数ハンドルの詳細については、関数ハンドルの作成を参照してください。

出力引数

すべて折りたたむ

四分木構造。スパース行列として返されます。S(k,m) がゼロ以外の場合、(k,m) は分解のブロックの左上隅になり、ブロックのサイズは S(k,m) によって指定されます。

データ型: double

ヒント

  • qtdecomp は、128 × 128 や 512 × 512 といった 2 のべき乗の大きさをもつ正方形のイメージに適しています。このようなイメージは、ブロックの大きさが 1 × 1 になるまで分割できます。qtdecomp を 2 のべき乗数でない大きさのイメージに適用すると、ある時点で分割がそれ以上できなくなります。たとえば、イメージが 96 × 96 の場合、48 × 48 のサイズのブロックに分割でき、さらに 24 × 24、12 × 12、6 × 6、3 × 3 のサイズまで分割できます。3 × 3 より小さく分割することはできません。このイメージを処理するには、mindim を 3 (または 2 のべき乗の 3 倍) に設定しなければなりません。関数 fun を含む構文を使用する場合、ブロックをそれ以上分割できない時点で、関数は 0 を返さなければなりません。

アルゴリズム

関数 qtdecomp は、正方形のイメージを同じサイズの 4 つの正方形ブロックに分割し、各ブロックをテストして、均一性の条件を満たしているかどうかを確認します。ブロックが条件を満たしている場合、それ以上の分割は行いません。条件を満たしていない場合、そのブロックをさらに 4 ブロックに分割し、それらのブロックにテスト条件を適用します。このプロセスを、各ブロックが条件を満たすまで繰り返します。この結果、それぞれ異なる大きさのブロックができます。

R2006a より前に導入