matlab数据块的dct编码,[转载]基于DCT图像压缩编码算法的MATLAB实现
圖像壓縮的過程可以概括成圖所示的三個步驟,原始圖像經映射變換后的數據再經量化器和熵編碼器成為碼流輸出。
(1)映射變換。其目的是通過映射改變圖像數據的特性,使之更有利于壓縮編碼。
(2)量化器。在限失真編碼中要對映射后的數據進行量化,若量化是對映射后的數據逐個的進行的,則稱標準量化,若量化是成組的進行的,則稱矢量量化,量化總會造成某些信息丟失,形成失真,即量化失真或量化噪聲,為使失真小,應量化的精細,但壓縮比就高不了,這是一對矛盾,應選用恰當的量化級數和量化曲線形狀來緩解這對矛盾,量化器的引入是圖像編碼產生失真的根源,在要求復原圖像與原圖完全一致的無失真編碼器中必須不用量化器,但這樣一來,壓縮比難以提高,在多數應用中,存在少量失真并不可怕,只要把失真的程
度和性質控制在允許的范圍內,也就是把復原圖像的主觀質量控制在允許的程度內,就可以
在滿足應用要求的前提下提高壓縮比,值得注意的是,對于同樣的量化失真,不同的映射變
換和反變換反映不同性質的復原圖像的失真,人眼對某些性質的失真敏感而對另一些性質
的失真不敏感。
(3)熵編碼器。這一步是用來消除符號編碼冗余度的,它一般不產生失真,理想的情況
是編出的碼流的平均碼長等于量化后數據的信息熵,常用的編碼方法有許多種,例如分組
碼、行程碼(RLC)和變長碼(VLC)、不分組碼以及算術碼(Arithmatic Coing等)。行程碼傳輸
的是數據行程長度而不是數據本身,例如要傳108個0,用行程碼是改為傳行程碼標記和行程長度1080在變長碼中最常用的是霍夫曼(Hufman)碼,基本原則是對出現概率大的數值用短碼來編,對出現概率小的數值用長碼來編,從而使平均碼長減小。降低碼率,在實際編碼器中常把RLc和Hufman碼結合起來,稱為霍夫曼行程碼,在H.261,JPEG,啪PEG等國際昧準中用到它,而算術碼則用于JPEG,H.263,JBIG等國際標準中。
3) MATLAB仿真實現
根據壓縮編碼算法,要將一幅灰度圖像進行壓縮編碼,首先把圖像分成8×8的像素塊,分塊
進行DCT變換后,根據標準量化表Es]對變換系數進行量化后,再對直流系數(DC)進行預測編碼,然后根據標準的Huffman碼表蜘進行熵編碼,輸出壓縮圖像的比特序列,實現了圖像壓縮。在接收端,則經過Huffman熵解碼、DC系數和AC系數可變長解碼、反量化后,再進行反DCT變換得到重建圖像。對一幅圖像進行編解碼的MATLAB程序流程圖:
2、離散余弦變換(DCT)
2.1DCT的定義
DCT變換利用傅立葉變換的性質.采用圖像邊界褶翻將像變換為偶函數形式,然后對圖像進行二維傅立葉變換,變后僅包含余弦項.所以稱之為離散余弦變換。二維離散余弦變換DCT(DiscreteCosineTransform)的定為.假設矩陣A的大小為MxN。
其中。Bpq稱為矩陣A的DCT系數。在MATLAB中,矩陣的下標從l開始而不是從0開始的,所以MATLAB中的矩陣元素A(1,1)和B(1,1)分別對應于上面定義中的值A加和B。。,
依此類推。DCT是一種可逆變換,離散反余弦變換定義如下:
上式的含義是任何MxN的矩陣A都nJ以表示為一系列有下面形式的函數的和:
這些函數稱為DCT變換的基函數。這樣.Bpq就可以看成是應用于每個基函數的加權。
2.2DCT和圖像壓縮
DCT編碼屬于正交變換編碼方式.用于去除圖像數據的空間冗余。變換編碼就是將圖像光強矩陣(時域信號)變換到系數空間(頻域信號)上進行處理的方法。在空問上具有強相
關的信號,反映在頻域上是在某些特定的區域內能量常常被集中在一起,或者是系數矩陣的分布具有某些規律。我們可以利用這些規律在頻域上減少量化比特數,達到壓縮的目的。圖像經DCT變換以后,DCT系數之間的相關性已經很小。而且大部分能量集中在少數的系數上,因此,DCT變換在圖像壓縮中非常有用,是有損圖像壓縮國際標準JPEG的核心。從原理上講可以對整幅圖像進行DCT變換,但由于圖像各部位上細節的豐富程度不同,這種整體處理的方式效果不好。為此,發送者首先將輸入圖像分解為8x8或16x16的塊,然后再對每個圖像塊進行二維DCT變換,接著再對DCT系數進行量化、編碼和傳輸;接收者通過對量化的DCT系數進行解碼,并對每個圖像塊進行的二維DCT反變換.最后將操作完成后所有的塊拼接起來構成一幅單一的圖像。對于一般的圖像而言,大多數DCT系數值都接近于0,町以去掉這些系數而不會對重建圖像的質量產生霞大影響。此,利用DCT進行圈像壓縮確實可以節約大量的存儲空間在宴驗中,先將輸入的原始lena圖像分為8x8的塊,然
后再對每個塊進行二維DCT變換。MATLAB圖像處理上具箱中提供的二維DCT變換及DCT反變換函數如下。
2.2.1.dcL2
dct2實現罔像的二維離散余弦變換.其語法格式為:
(1)B=dct2(A)
返回圖像A的二維離散余弦變換值,其大小與A相同且各元素為離散余弦變換的系數B(K1,k2)。
(2)B=dct2(A,in,n)或B=dct2(A,[m,n])
如果m和n比圖像A大,在對圖像進行二維離散余弦變換之前,先將圖像A補零至mxn如果m和n比圖像A小。則進行變換之前,將圖像A剪切。
2.2.2 idct2
idct2可以實現圖像的二維離散余弦反變換,其語法格式為:
B=idct2(A);B=idct2(A,m,n)或B=idct2(A,[m,n])。
3圖像編碼
3.1圖像編碼的分類
圖像編碼壓縮的方法目前有很多,其分類方法根據出發點不同而有差異。
根據解壓重建后的圖像和原始圖像之間是否具有誤差(對原圖像的保真程度),圖像編碼壓縮分為無誤差(亦稱無失真、無損、信息保持)編碼和有誤差(有失真或有損)編碼兩大類。
無損壓縮(冗余度壓縮、可逆壓縮):是一種在解碼時可以精確地恢復原圖像,沒有任何損失的編碼方法,但是壓縮比不大,通常只能獲得1~5倍的壓縮比。用于要求重建后圖像嚴格地和原始圖像保持相同的場合,例如
復制、?保存十分珍貴的歷史、文物圖像等;
有損壓縮(不可逆壓縮):只能對原始圖像進行近似的重建,而不能精確復原,適合大數工用于存儲數字化了的模擬數據。
壓縮比大,但有信息損失。
3.2
無損編碼
3.2.1行程編碼(RLE)
在一個逐行存儲的圖像中,具有相同灰度值的一些象素組成的序列稱為一個行程。在編碼時,對于每個行程只存儲一個灰度值的碼,再緊跟著存儲這個行程的長度。這種按照行程進行的編碼被稱為行程編碼(Run
Length Encoding)。
行程編碼對于僅包含很少幾個灰度級的圖像,特別是二值圖像,比較有效。
3.2.2Huffman編碼
Huffman編碼是50年代提出的一種基于統計的無損編碼方法,它利用變長的碼來使冗余量達到最小。通過一個二叉樹來編碼,使常出現的字符用較短的碼代表,不常出現的字符用較長的碼代表。靜態Huffman編碼使用一棵依據字符出現的概率事先生成好的編碼樹進行編碼。而動態Huffman編碼需要在編碼的過程中建立編碼樹。
由于Huffman編碼所得到的平均碼字長度可以接近信源的熵,因此在變長編碼中是最佳的編碼方法,故也稱為熵編碼。
具體編碼方法是:①把輸入元素按其出現概率的大小順序排列起來,然后把兩個具有最小概率的元素之概率加起來;②把該概率之和同其余概率大小順序排隊,然后再把兩個最小概率加起來,再重新排隊;③重復②,直到最后得到和為1的根節點。
3.3有損編碼
3.3.1量化
將圖像用較少的灰度級別來表示是最簡單的減小數據量的方法,這種方法就是標量量化方法。更一般的情況是,針對連續量的采樣過程,量化是用有限個狀態來表示連續值。
3.3.2預測編碼
預測編碼根據數據在時間和空間上的相關性,根據統計模型利用已有樣本對新樣本進行預測,將樣本的實際值與其預測值相減得到誤差值,再對誤差值進行編碼。由于通常誤差值比樣本值小得多,因而可以達到數據壓縮的效果。
模擬量到數字量的轉換過程是脈沖編碼調制過程PCM
,也稱PCM編碼。對于圖像而言,直接以PCM編碼,存儲量很大。預測編碼可以利用相鄰象素之間的相關性,用前面已出現的象素值估計當前象素值,對實際值與估計值的差值進行編碼。常用的一種線性預測編碼方法是差分脈沖編碼調制DPCM。
預測編碼通常不直接對信號編碼,而是對預測誤差編碼。當預測比較準確,誤差較小時,即可達到編碼壓縮的目的。這種編碼稱之為差分脈沖編碼調制(DPCM),上圖是原理框圖。在該系統中,xN為tN時刻的亮度取樣值。預測器根據tN時刻之前的樣本x1,x2,…,xN-1對xN作預測,得到預測值x'N。xN與x'N之間的誤差為
量化器對eN進行量化得到e‘N。編碼器對e’N
進行編碼發送。接收端解碼時的預測過程與發送端相同,所用預測器亦相同。接收端恢復的輸出信號?是xN的近似值,兩者的誤差是
當ΔxN足夠小時,輸入信號xN 和DPCM系統的輸出信號幾乎一致。
3.3.3DCT編碼
DCT變換是圖像壓縮標準中常用的變換方法,如JPEG標準中將圖像按8x8分塊利用DCT變換編碼實現壓縮
3.4保真度準則
在圖像壓縮編碼中,解碼圖像與原始圖像可能會差異,因此,需要評價壓縮后圖像的質量。描述解碼圖像相對原始圖像偏離程度的測度一般稱為保真度(逼真度)準則。常用的準則可分為兩大類:客觀保真度準則和主觀保真度準則。
3.4.1客觀保真度準則
最常用的客觀保真度準則是原圖像和解碼圖像之間的均方根誤差和均方根信噪比兩種。令f(x,y)代表原圖像,
代表對f(x,y)先壓縮又解壓縮后得到的f(x,y)的近似,對任意x和y,f(x,y)和
之間的誤差定義為:
若f(x,y)和 均為M×N,則它們之間均方根誤差 為:
如果將
看作原始圖f(x,y)和噪聲信號e(x,y)的和,那么解壓圖像的均方信噪比
為:
如果對上式求平方根,就得到均方根信噪比
3.4.2主觀保真度準則
盡管客觀保真度準則提供了一種簡單、方便的評估信息損失的方法,但很多解壓圖最終是供人觀看的。事實上,具有相同客觀保真度的不同圖像,在人的視覺中可能產生不同的在視覺效果。這是因為客觀保真度是一種統計平均意義下的度量準則,對于圖像中的細節無法反映出來。而人的視覺系統具有獨特的特性,能夠覺察出來。這種情況下,用主觀的方法來測量圖像的質量更為合適。1種常用的方法是對1組(不少于20人)觀察者顯示圖像,并將他們對該圖像的評分取平均,用來評價一幅圖像的主觀質量。
4?MATLAB仿真及效果
4.1程序
%程序功能:模擬DCT編碼解碼過程,生成帶“塊效應”的圖像
%步驟:灰度圖像→DCT→量化→反量化→IDCT
%下一步目標:實現對任意大小圖象的處理。(判斷圖象大小,若不是2的整數次方,則補零)
I=imread('cameraman.tif')
I=im2double(I)?%轉換圖像矩陣為雙精度型。
T=dctmtx(8)%產生二維DCT變換矩陣
%計算二維DCT,矩陣T及其轉置是DCT函數P1*X*P2的參數
a1=[16 11 10 16 24?40?51?61;
12 12 14
19 26?58?60?55;
14 13 16
24 40?57?69?56;
14 17 22
29 51?87?80?62;
18 22 37
56 68?109 103 77;
24 35 55
64 81?104 113 92;
49 64 78
87 103 121 120 101;
72 92 95
98 112 100 103 99 ];
for i=1:8:200
for
j=1:8:200
P=I(i:i+7,j:j+7);
K=T*P*T';
I2(i:i+7,j:j+7)=K;
K=K./a1;%量化
K(abs(K)<0.03)=0;
I3(i:i+7,j:j+7)=K;
end
end
figure;
imshow(I2);
title('DCT變換后的頻域圖像');%顯示DCT變換后的頻域圖像
for i=1:8:200
for
j=1:8:200
P=I3(i:i+7,j:j+7).*a1;%反量化
K=T'*P*T;
I4(i:i+7,j:j+7)=K;
end
end
figure;
imshow(I4);
title('復原圖像');
imwrite(I4,'復原圖像6.jpg');
B=blkproc(I,[8,8],'P1*x*P2',T,T')
%二值掩模,用來壓縮DCT系數,只留下DCT系數中左上角的10個
mask=[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
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 0 0 0 0 ]
B2=blkproc(B,[8
8],'P1.*x',mask)?%只保留DCT變換的10個系數
I2=blkproc(B2,[8
8],'P1*x*P2',T',T)?%重構圖像
figure
imshow(I)
title('原始圖像');
figure
imshow(I2);
title('壓縮圖像');
figure
imshow(dct2(I));
figure
mesh(dct2(I))
colorbar('horiz')
總結
以上是生活随笔為你收集整理的matlab数据块的dct编码,[转载]基于DCT图像压缩编码算法的MATLAB实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《技术人创业攻略》-用技术改变世界!
- 下一篇: 对普通文件 霍夫曼编解码 matlab,