出處:
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的來說,計算量就已經很大了,更不用說別的高解析...