Main Content

dct

説明

y = dct(x) は、入力配列 x の単項離散コサイン変換を返します。出力 y は、x と同じサイズになります。x が複数次元配列である場合、dct は、サイズが 1 より大きい最初の配列次元に沿って動作します。

y = dct(x,n) は、x にゼロを付加するか関連する次元を切り捨て、長さ n にしてから変換します。

y = dct(x,n,dim) は、次元 dim に沿って変換を計算します。次元を入力し、n の既定値を使用するには、2 番目の引数を空 [] として指定します。

y = dct(___,'Type',dcttype) は、計算する離散コサイン変換のタイプを指定します。詳細については、離散コサイン変換を参照してください。このオプションは、上述の任意の構文と組み合わせることができます。

すべて折りたたむ

何個の DCT 係数でエネルギー の 99% が表されるかを順番に求めます。

x = (1:100) + 50*cos((1:100)*2*pi/40);
X = dct(x);
[XX,ind] = sort(abs(X),'descend');
i = 1;
while norm(X(ind(1:i)))/norm(X) < 0.99
   i = i + 1;
end
needed = i;

信号を再構成し、元の信号と比較します。

X(ind(needed+1:end)) = 0;
xx = idct(X);

plot([x;xx]')
legend('Original',['Reconstructed, N = ' int2str(needed)], ...
       'Location','SouthEast')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original, Reconstructed, N = 3.

米国の 1 セント銅貨を鋳造するために使用される型の深さの測定値を含むファイルを読み込みます。米国国立標準技術研究所で取得されたこのデータは、128 行 128 列のグリッド上でサンプリングされています。データを表示します。

load penny

surf(P)
view(2)
colormap copper
shading interp
axis ij square off

イメージ データの離散コサイン変換を計算します。最初に行、次に列に沿って動作します。

Q = dct(P,[],1);
R = dct(Q,[],2);

DCT 係数のどれくらいの部分にイメージの 99.98% のエネルギーが含まれるかを求めます。

X = R(:);

[~,ind] = sort(abs(X),'descend');
coeffs = 1;
while norm(X(ind(1:coeffs)))/norm(X) < 0.9998
   coeffs = coeffs + 1;
end
fprintf('%d of %d coefficients are sufficient\n',coeffs,numel(R))
3572 of 16384 coefficients are sufficient

必要な係数のみを使用してイメージを再構成します。

R(abs(R) < abs(X(ind(coeffs)))) = 0;

S = idct(R,[],2);
T = idct(S,[],1);

再構成されたイメージを表示します。

surf(T)
view(2)
shading interp
axis ij square off

米国の 1 セント銅貨を鋳造するために使用される型の深さの測定値を含むファイルを読み込みます。米国国立標準技術研究所で取得されたこのデータは、128 行 128 列のグリッド上でサンプリングされています。データを表示します。

load penny

surf(P)
view(2)
colormap copper
shading interp
axis ij square off

DCT-1 バリアントを使用して、イメージ データの離散コサイン変換を計算します。最初に行、次に列に沿って動作します。

Q = dct(P,[],1,'Type',1);
R = dct(Q,[],2,'Type',1);

逆変換を行います。逆変換を切り捨てて、再構成後のイメージの各次元が元の 1/2 の長さになるようにします。

S = idct(R,size(P,2)/2,2,'Type',1);
T = idct(S,size(P,1)/2,1,'Type',1);

再度、逆変換を行います。逆変換にゼロを付加し、再構成後のイメージの各次元が元の 2 倍の長さになるようにします。

U = idct(R,size(P,2)*2,2,'Type',1);
V = idct(U,size(P,1)*2,1,'Type',1);

元のイメージと再構成後のイメージを表示します。

surf(V)
view(2)
shading interp
hold on

surf(P)
view(2)
shading interp

surf(T)
view(2)
shading interp
hold off
axis ij equal off

入力引数

すべて折りたたむ

入力配列。実数値または複素数値のベクトル、行列、または N 次元配列として指定します。

例: sin(2*pi*(0:255)/4) は、正弦波を行ベクトルとして指定します。

例: sin(2*pi*[0.1;0.3]*(0:39))' は、2 チャネルの正弦波を指定します。

データ型: single | double
複素数のサポート: あり

変換の長さ。正の整数スカラーで指定します。

データ型: single | double

動作する対象の次元。正の整数スカラーとして指定します。

データ型: single | double

離散コサイン変換のタイプ。1 ~ 4 の正の整数スカラーとして指定します。DCT のさまざまなタイプの定義については、離散コサイン変換を参照してください。

データ型: single | double

出力引数

すべて折りたたむ

離散コサイン変換。実数値または複素数値のベクトル、行列、または N 次元配列として返されます。

詳細

すべて折りたたむ

離散コサイン変換

離散コサイン変換 (DCT) は離散フーリエ変換と密接に関連しています。多くの場合、わずか数個の DCT 係数から、きわめて正確にシーケンスを復元することができます。これは、データ量の圧縮を必要とするアプリケーションで役立つ特性です。

DCT には 4 つの標準バリアントがあります。長さ N の信号 x およびクロネッカー デルタ δkℓ を使うと、変換は以下のように定義されます。

  • DCT-1:

    y(k)=2N1n=1Nx(n)11+δn1+δnN11+δk1+δkNcos(πN1(n1)(k1))

  • DCT-2:

    y(k)=2Nn=1Nx(n)11+δk1cos(π2N(2n1)(k1))

  • DCT-3:

    y(k)=2Nn=1Nx(n)11+δn1cos(π2N(n1)(2k1))

  • DCT-4:

    y(k)=2Nn=1Nx(n)cos(π4N(2n1)(2k1))

MATLAB® のベクトルは 0 から N – 1 ではなく 1 から N で実行されるため、この級数には通常の n = 0 および k = 0 の代わりに、n = 1 および k = 1 のインデックスが付けられます。

DCT のすべてのバリアントは "単項" (または、"直交" と同等) です。その逆変換を求めるには、各定義で k と n を切り替えます。DCT-1 と DCT-4 はそれ自体の逆変換です。DCT-2 と DCT-3 は互いの逆変換です。

参照

[1] Jain, A. K. Fundamentals of Digital Image Processing. Englewood Cliffs, NJ: Prentice-Hall, 1989.

[2] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 1999.

[3] Pennebaker, W. B., and J. L. Mitchell. JPEG Still Image Data Compression Standard. New York: Van Nostrand Reinhold, 1993.

拡張機能

バージョン履歴

R2006a より前に導入

参考

| | (Image Processing Toolbox) | (Image Processing Toolbox)