1

仕組みがよくわかりませんqtdecomp...

I = [1    1    1    1    2    3    6    6
     1    1    2    1    4    5    6    8
     1    1    1    1   10   15    7    7
     1    1    1    1   20   25    7    7
    20   22   20   22    1    2    3    4
    20   22   22   20    5    6    7    8
    20   22   20   20    9   10   11   12
    22   22   20   20   13   14   15   16];

S = qtdecomp(I,2);
disp(full(S));

この結果は次のとおりです。

   4     0     0     0     1     1     2     0
   0     0     0     0     1     1     0     0
   0     0     0     0     1     1     2     0
   0     0     0     0     1     1     0     0
   4     0     0     0     1     1     1     1
   0     0     0     0     1     1     1     1
   0     0     0     0     1     1     1     1
   0     0     0     0     1     1     1     1

左下の4×4行列では、ブロック要素の最大値(22)から最小値(20)を引いた値が2なので、この部分を分解するとそのまま残ります。

uint8マトリックスでこれを行うと:

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

S = qtdecomp(I,2/255);
disp(full(S));

答えは先ほどと同じです。しかし、これに変更Sすると:

S = qtdecomp(I,1.9/255);

答えは

 4     0     0     0     1     1     2     0
 0     0     0     0     1     1     0     0
 0     0     0     0     1     1     2     0
 0     0     0     0     1     1     0     0
 4     0     0     0     1     1     1     1
 0     0     0     0     1     1     1     1
 0     0     0     0     1     1     1     1
 0     0     0     0     1     1     1     1

左下の 4*4 行列は分解されるはずですが、なぜ分解されないのでしょうか?

4

1 に答える 1

0

ここで matlab が行うことは、Iuint8 がしきい値を 255 倍して丸め、1.9/255 が 2 に評価される場合です。

qtdecompこれは、 (ctrl+D を押して)のソース コードを開くか、ここで確認できます。ファイルの終わり近くに if/elseif があります ( params{1} = round(255 * params{1});)。

S = qtdecomp(I,1/255);探している結果を得るために使用できるはずです。

于 2012-09-16T14:36:42.723 に答える