【圖像壓縮】基于離散余弦變換DCT圖像壓縮(含PNSR壓縮比)附Matlab代碼
??作者簡介:熱愛科研的Matlab仿真開發(fā)者,修心和技術(shù)同步精進,
代碼獲取、論文復(fù)現(xiàn)及科研仿真合作可私信。
??個人主頁:Matlab科研工作室
??個人信條:格物致知。
更多Matlab完整代碼及仿真定制內(nèi)容點擊??
?? ? ?? ?? ? ?? ? ? ? ?? ? ? ?
?? ? ? ? ? ? ? ?? ? ? ? ? ? ?? ?? ? ?? ?? ? ? ?
?? 內(nèi)容介紹
圖像壓縮是數(shù)字圖像處理中的重要技術(shù),它可以有效地減小圖像文件的大小,從而節(jié)省存儲空間和傳輸帶寬。在圖像壓縮的過程中,離散余弦變換(DCT)是一種常用的方法,它可以將圖像轉(zhuǎn)換為頻域表示,進而實現(xiàn)壓縮。本文將介紹基于DCT的圖像壓縮方法,并探討其壓縮比和峰值信噪比(PNSR)的相關(guān)性。
首先,我們來了解一下離散余弦變換。DCT是一種廣泛應(yīng)用于信號處理和圖像壓縮中的變換方法,它將一個信號或圖像分解為不同頻率的成分。在DCT中,圖像被分割成8x8的小塊,每個小塊都會進行DCT變換。通過DCT變換,圖像中的能量集中在少量的頻率分量上,這為壓縮提供了可能。
基于DCT的圖像壓縮方法通常包括以下步驟:首先,將圖像分割成8x8的小塊;然后,對每個小塊進行DCT變換;接著,利用量化表對DCT系數(shù)進行量化;最后,使用熵編碼對量化后的系數(shù)進行編碼。通過這些步驟,可以大大減小圖像文件的大小,實現(xiàn)圖像的壓縮。
在圖像壓縮的過程中,壓縮比和PNSR是兩個重要的評價指標(biāo)。壓縮比指的是壓縮前后圖像文件大小的比值,它可以反映壓縮效果的好壞。通常情況下,壓縮比越大,表示壓縮效果越好。而PNSR是衡量壓縮后圖像質(zhì)量損失的指標(biāo),它可以通過計算原始圖像和壓縮后圖像之間的均方誤差來得到。一般來說,PNSR的數(shù)值越大,表示圖像質(zhì)量損失越小。
通過實驗我們可以發(fā)現(xiàn),壓縮比和PNSR之間存在一定的關(guān)系。通常情況下,隨著壓縮比的增大,PNSR會逐漸減小,即圖像的質(zhì)量會逐漸下降。這是因為在壓縮過程中,為了減小圖像文件的大小,會對圖像的信息進行丟失或者量化,從而導(dǎo)致圖像質(zhì)量的損失。因此,在實際應(yīng)用中,需要根據(jù)具體的需求和場景來平衡壓縮比和圖像質(zhì)量。
總之,基于離散余弦變換的圖像壓縮是一種常用的壓縮方法,它可以有效地減小圖像文件的大小,節(jié)省存儲空間和傳輸帶寬。在壓縮過程中,壓縮比和PNSR是兩個重要的評價指標(biāo),它們之間存在一定的關(guān)系。在實際應(yīng)用中,需要根據(jù)具體的需求來選擇合適的壓縮參數(shù),以實現(xiàn)最佳的壓縮效果。
?? 部分代碼
%% 將圖像sunflower.jpg劃分為8×8塊。 計算每個塊的DCT。 保留每個塊中最高DCT系數(shù)的前25%(相對于幅度最高),并將其他系數(shù)設(shè)置為零。 對每個塊進行逆DCT,然后顯示重建的圖像。 計算重建誤差。
clear all;
clc;
%%
%loading input image
img = imread('data\img (1).jpg');
img = rgb2gray(img);
[p,q]=size(img);
%computing dct for 8x8 blocks
for i=1:p/8
? ?for j=1:q/8
? ? ? ?coeffs = dct2(img(8*(i-1)+1:8*i,8*(j-1)+1:8*j));
? ? ? ?%retaining only top 25% co-efficients by magnitude
? ? ? ?coeffs_flatten = reshape(coeffs,[],1);
? ? ? ?[val,ind]=sort(abs(coeffs_flatten),'descend');
? ? ? ?coeffs(ind(17:end))=0;
? ? ? ?%reconstructing image with most important information
? ? ? ?reconstructed_img(8*(i-1)+1:8*i,8*(j-1)+1:8*j)=idct2(coeffs);
? ?end
end
%plotting figures
figure()
imshow(img), title('原圖');
reconstructed_img=uint8(reconstructed_img);
figure()
imshow(reconstructed_img), title('重建圖像');
imwrite(reconstructed_img,'recontructed_dct.jpg');
figure()
%diff between reconstructed and original image
%the error image is scaled appropriately for proper visualization
err_img=(int8(reconstructed_img)-int8(img));
imshow(8*err_img)
%euclidean reconstruction error
err=norm(double(reconstructed_img-img))
?? 運行結(jié)果


?? 參考文獻
本程序參考以下中文EI期刊,程序注釋清晰,干貨滿滿。
[1] 羅云,謝斌盛.基于MATLAB的無線傳感器網(wǎng)絡(luò)的低功耗仿真[J].信息系統(tǒng)工程, 2015(6):2.DOI:10.3969/j.issn.1001-2362.2015.06.012.
[2] 余秋菊.基于DCT變換的JPEG圖像壓縮及其MATLAB實現(xiàn)[J].科技信息:學(xué)術(shù)研究, 2008, 000(036):566-567.DOI:CNKI:SUN:KJXI.0.2008-36-467.