このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
離散コサイン変換 (DCT)は、さまざまな大きさと周波数からなる正弦波の和として、イメージを表現します。関数dct2
は、イメージの 2.次元離散コサイン変換 (DCT)を計算します。打折は、標準のイメージについて、視覚的に重要な情報のほとんどが、打折の数個の係数に集中しているという性質をもっています。このため、打折はイメージ圧縮の用途にしばしば使用されます。たとえば、打折は、JPEGとして知られている国際標準の非可逆画像圧縮アルゴリズムで中心的な機能を果たしています (この名前は、この標準を策定したワーキング グループの名前、联合摄影专家组に因んで付けられています)。
M行 N列の行列A.
の 2.次元 打折は、次のように定義されます。
Bpqの値はA.
の“DCT係数" と呼ばれています (MATLAB)®の行列インデックスは、0からでなく 1.から始まります。このため、MATLABの行列の要素A(1,1)
およびB(1,1)
は、数学上の量としてはA.00およびB00に対応します)。
打折は、逆変換も可能で、次の式で表せます。
逆 打折方程式は、任意の M行 N列の行列A.
が、
形式の関数锰の和として記述できることを意味するものとして解釈できます。
これらの関数は、打折の"基本関数"と呼ばれます。このため、打折係数Bpqは、各基底関数に適用された"重み" と見なすことができます。8.行 8.列の行列に対して、64個の基本関数が、このイメージにより示されます。
8.行 8.列の行列の 64個の基本関数
水平周波数は左から右方向へ増加し、垂直周波数は上から下へ増加します。左上の定数値基底関数は、“DC基底関数" と呼ばれ、対応する 打折係数B00は、多くの場合“DC係数" と呼ばれます。
图像处理工具箱™ ソフトウェアを使用して 打折を計算する方法は 2.つあります。最初の方法は、関数dct2
を使用します。dct2
は、快速傅里叶变换ベースのアルゴリズムを使用して、大きな入力を高速で処理できます。2.番目の方法は、打折"変換行列"を使う方法です。この行列は、関数dctmtx
から出力され、小さい正方行列、たとえば、8.行 8.列や 16行 16列の行列に対しては、非常に効率的なものです。M行 M列の変換行列T
は、次のように表すことができます。
M行 M列の行列A.
に対して、T*A
は、A.
の各列の 1.次元の 打折を各列に含む M行 M列の行列になります。A.
の 2.次元の 打折は、B=T*A*T'
として計算できます。T
が実数直交行列なので、その逆はその転置と同じものになります。そのため、B
の 2.次元逆 打折は、T'*B*T
で与えられます。
この例では、離散コサイン変換 (DCT)を使用してイメージを圧縮する方法を説明します。この例は、入力イメージの 8.行 8.列のブロックの 2.次元 打折を計算し、各ブロックにある 64の 打折係数のうち 10個以外のすべてを 0に置き換えます。そして、各ブロックの 2.次元逆 打折を使用して、イメージを再構成します。この例は変換行列の計算法を使用しています。
打折は JPEGイメージ圧縮アルゴリズムで使用されます。入力イメージは 8.行 8.列または 16行 16列のブロックに分割され、各ブロックの 2.次元 打折が計算されます。打折係数は、続いて量子化、暗号化されて送信されます。JPEGレシーバ (または、JPEGファイル リーダー) は、量子化した 打折係数を復号し、各ブロックの 2.次元逆 打折を計算し、その結果を集めて 1.つのイメージを作成します。一般的なイメージでは、打折係数の多くは、ほとんどゼロに近い値になります。これらの係数は再構成後のイメージの質に大きな影響を与えないので、切り捨てることができます。
イメージをワークスペースに読み取って双重的
クラスに変換します。
I=imread(“摄影师,tif”);I=im2倍(I);
イメージ内にある 8.行 8.列のブロックの 2.次元 打折を計算します。関数dctmtx
は N行 N列の 打折変換行列を返します。
T=dctmtx(8);dct=@(block_struct)T*block_struct.data*T';B=blockproc(I[8],dct);
各ブロックにある 64の 打折係数のうち 10個以外のすべてを切り捨てます。
掩码=[1 1 1 1 0 0 0 0 0 0 1 1 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 0 0 0 0 0 0 0 0];B2=块过程(B,[8 8],@(块结构)掩码。*块结构数据);
各ブロックの 2.次元逆 打折を使用してイメージを再構成します。
invdct=@(block_struct)T'*block_struct.data*T;I2=blockproc(B2[8],invdct);
元のイメージと再構成後のイメージを左右に並べて表示します。再構成イメージに質的な低下が見られますが、打折係数の約 85% を切り捨てたにもかかわらず、はっきりとイメージを認識できます。
imshow(I)
图imshow(I2)