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