二維DCT變換

2021-07-10 06:33:28 字數 3119 閱讀 4556

出處:

dct,又叫離散預先變換,它的第二種型別,經常用於訊號和影象資料的壓縮。經過dct變換後的資料能量非常集中,一般只有左上角的數值是非零的,也就是能量都集中在離散余弦變換後的直流和低頻部分。

1,一維dct變換

我們首先看著一維的dct變換,這是二維的基礎。一維的dct變換共有8種,其中最實用的是第二種形式,公式如下:

dct1 其中c(u)是加上去乙個係數,為了能使dct變換矩陣成為正交矩陣,在後面二維變換將看到他的作用。n是f(x)的總數。相比其他幾種形式,他的運算還是比較簡單的,因此也用的比較廣

2,二維dct變換

二維dct變換是在一維的基礎上再進行一次dct變換,這個比較好理解,直接看公式:

這裡只討論兩個n相等的情況,也就是資料是方陣的形式,在實際應用中對不是方陣的資料都是先補齊再進行變換的。為了matlab**方便點,寫成矩陣形式:

用matlab來模擬一下,使用隨機生成的4x4矩陣作為輸入,程式如下:

clear;

clc;

x=round(rand(4)*100);%隨機生成的資料

a=zeros(4);%變換矩陣

fori=0:3

forj=0:3

ifi==0

a=sqrt(1/4);

else

a=sqrt(2/4);

end

a(i+1,j+1)=a*cos(pi*(j+0.5)*i/4);

endendy=a*x*a';%dct變換

yy=dct2(x);%用matlab中的函式進行dct變換

y是使用上面的公式進行變換,yy是用matlab自帶的dct2函式變換,結果是是:

x =

61 19 50 20

82 26 61 45

89 90 82 43

93 59 53 97

y = 242.5000 32.1613 22.5000 33.2212

-61.8263

7.9246 -10.7344

30.6881

-16.5000 -14.7549

22.5000 -6.8770

8.8322 16.6881 -35.0610 -6.9246

yy =

242.5000 32.1613 22.5000 33.2212

-61.8263

7.9246 -10.7344

30.6881

-16.5000 -14.7549

22.5000 -6.8770

8.8322 16.6881 -35.0610 -6.9246

可以看出y和yy的結果是一樣的,這也進一步驗證了上面的公式是正確的。由於x是隨機生成的,相關性很小,變換後的結果比較亂;如果是訊號或影象這樣相關性比較大的資料的話,數值會集中在左上角,右下角一般都是零,再使用「之」字型掃瞄得到資料流會包含很多連續的零,編碼後資料量會非常小,這就是dct變換帶來的好處。

3.二維dct反變換

dct逆變換的公式如下

矩陣形式可以由正變換的公式直接推出來,因為在a中加了c(i)這個係數,使得a成為了正交矩陣,所以我們就可以這樣做:

在用matlab來驗證是否能反變換出原來的資料:

clear;

clc;

x=[ 61

1950

2082

2661

4589

9082

4393

5953

97];

a=zeros(4);

fori=0:3

forj=0:3

ifi==0

a=sqrt(1/4);

else

a=sqrt(2/4);

end

a(i+1,j+1)=a*cos(pi*(j+0.5)*i/4);

endendy=a*x*a';

x1=a'*y*a;

x使用的是上面正變換用的資料,執行後得到的x1為:

x1 =61.0000   19.0000   50.0000   20.0000

82.0000 26.0000 61.0000 45.0000

89.0000 90.0000 82.0000 43.0000

93.0000 59.0000 53.0000 97.0000

和x完全相等。在實際進行編碼的時候,比如jpeg壓縮的時候,只會對y左上角的資料進行傳輸,所以解碼出來的內容不會完全和原來的相同。

4.整數dct變換

說道dct就順便提一下x264中的整數dct變換,整數dct變換是以dct變換為基礎的,為了減少計算量做的一些調整,下面我寫一下整數dct變換公式的大致推導過程:

這樣在對大括號部分進行計算時就都是加法和減法了,而且在精度上沒有太大降低。在x264實際編碼中,變換和量化是一起進行的,使得編碼速度有了很大的提高。

二維DCT變換 Python實現

coding utf 8 author konmu dct二維變換 from numpy import array as matrix,arange,zeros,transpose,matmul,ones from math import sqrt,cos,pi 作業代轉化矩陣1 a matrix ...

二維傅利葉變換需知

from 如下,這個 是實現灰度影象作二維傅利葉變換後的非線性變換哈 clear all i imread coins.png f fft2 im2double i f fftshift f f abs f t log f 1 subplot 1,2,1 imshow f,title 未經變換的頻譜...

DCT變換和DFT變換

這裡我只談論二維的dft變換,有關一維的dft,請檢視一下部落格,裡面有詳細介紹 根據上面的公式,我們可以得到對應的離散傅利葉變換呃 下面是matlab版本的 和公式 12 是一一對應的,時間複雜度為 mn 2,通常記成n 4,因此對於乙個512 512的來說,計算量就已經很大了,更不用說別的高解析...