【图像压缩】基于matlab余弦变换及霍夫曼编码jpeg压缩和解压【含Matlab源码 2086期】
?一、DCT圖像無損壓縮簡介
1 圖像壓縮
圖像壓縮按照壓縮過程中是否有信息的損失以及解壓后與原始圖像是否有誤差可以分為無損壓縮和有損壓縮兩大類。無損壓縮是指不損失圖像質(zhì)量的壓縮,它是對文件的存儲方式進行優(yōu)化,采用某種算法表示重復的數(shù)據(jù)信息,文件可以完全還原,不會影響文件內(nèi)容。一般來說,由于無損壓縮只是刪除了圖像數(shù)據(jù)中的冗余信息,可以準確地恢復原始圖像,所以不可能達到很高的壓縮比。有損壓縮是指損失圖像質(zhì)量的壓縮,它將不相干的信息也刪除了,因此解壓時只能將原始圖像進行近似的還原,它的高壓縮比是以犧牲圖像質(zhì)量為代價的。
2 JPRG圖像壓縮
JPEG 提出的 JPEG 標準是為連續(xù)色調(diào)圖像的壓縮提供的公共標準。連續(xù)色調(diào)圖像并不局限于單色調(diào)( 黑白) 圖像,該標準可適用于各種多媒體存儲和通信應用所使用的灰度圖像、攝影圖像及靜止視頻壓縮文件。
JPEG 標準還提出:
①必須將圖像質(zhì)量控制在可視保真度高的范圍內(nèi),同時編碼器可被參數(shù)化,允許設置壓縮或質(zhì)量水平
②壓縮標準可以應用于任何一類連續(xù)色調(diào)數(shù)字圖像,并不應受到維數(shù)、顏色、畫面尺寸、內(nèi)容和色調(diào)的限制
③壓縮標準必須從完全無損到有損范圍內(nèi)可選,以適應不同的存儲 CPU 和顯示要求
圖像壓縮編碼方法從壓縮編碼算法原理上可以分為無損壓縮編碼、有損壓縮編碼、混合編碼方法。而JPEG 標準就是一種混合編碼方法,既有無損的壓縮編碼又有有損的壓縮編碼。有損壓縮方法是以 DCT 變換為基礎的壓縮方法,其壓縮率比較高,是JPEG 標準的基礎。無損壓縮方法又稱預測壓縮方法,是以二維 DPCM 為基礎的壓縮方式,解碼后能完全精確地恢復原圖像采樣值,其壓縮比低于有損壓縮方法。
觀察下圖中的編碼器負責降低輸入圖像的編碼、像素間和心理視覺冗余。在編碼處理的第一階段,離散余弦變換器將輸入圖像變換成一種( 通常不可見的) 格式,以便減少像素間的冗余。在第二階段,量化器根據(jù)預定義的保真度準則來減少映射變換器輸出的精確性,以便試圖去除心理視覺冗余數(shù)據(jù)。這種操作是不可逆的,當進行無損壓縮時,則必須將其忽略。在第三個即最后一個處理階段,熵編碼器根據(jù)所用的碼字對量化器輸出和離散余弦變換輸出創(chuàng)建碼字( 減少編碼冗余)。
3 二維離散余弦變換
離散余弦變換(Discrete Cosine Transform),簡稱DCT變換.是一種與傅立葉變換緊密相關的數(shù)學運算.在傅立葉級數(shù)展開式中,如果被展開的函數(shù)是實偶函數(shù),那么其傅立葉級數(shù)中只包含余弦項,再將其離散化可導出余弦變換,因此稱之為離散余弦變換.余弦變換實際上是傅立葉變換的實數(shù)部分,其主要用于圖像的壓縮,目前國際壓縮標準的JPEG格式中就用到了DCT變換。
在編碼過程中,首先將輸入圖像顏色空間轉(zhuǎn)換后分解為8× 8大小的數(shù)據(jù)塊,然后用正向二維DCT把每個塊轉(zhuǎn)變成64個DCT系數(shù)值,其中1個數(shù)值是直流(DC)系數(shù),即8× 8空域圖像子塊的平均值,其余的63個是交流(AC)系數(shù),接下來對DCT系數(shù)進行量化,最后將變換得到的量化的DCT系數(shù)進行編碼和傳送,形成壓縮后的圖像格式。在解碼過程中,先對已編碼的量化的DCT系數(shù)進行解碼,然后使用二維DCT反變換求逆量化并把DCT系數(shù)轉(zhuǎn)化為8× 8樣本像塊,最后將操作完成后的塊組合成一個單一的圖像。這樣就完成了圖像的壓縮和解壓過程.研究表明,DCT將8× 8圖像塊變換為頻域時數(shù)值集中在左上角,即低頻分量都集中在左上角,高頻分量分布在右下腳。而低頻部分包含了圖像大部分信息,相比之下,高頻部分包含的信息量較少。為了壓縮數(shù)據(jù),往往采用忽略高頻系數(shù)的辦法。而較低頻系數(shù)的修改對原始數(shù)據(jù)的影響較小。基于DCT的壓縮編碼屬于有損壓縮,通過去除圖像本身的冗余量和人的視覺冗余量來達到壓縮數(shù)據(jù)的目的,主要分為以下幾個步驟:
(1)正向離散余弦變換
(2)量化
(3)Z字形編碼
(4)使用差分脈沖編碼調(diào)制對直流系數(shù)進行編碼
(5)使用行程長度編碼對交流系數(shù)進行編碼
(6)熵編碼
(7)組成位數(shù)據(jù)流
4 二維DCT變換
二維離散余弦變換的正變換公式為:
在圖像的壓縮編碼中,N一般取8。
二維DCT的反變換公式為:
以上各式中的系數(shù):
5 Matlab調(diào)試
根據(jù)JPEG 壓縮編碼算法,要將一幅灰度圖像進行壓縮編碼,首先把圖像分成 8* 8 的像素塊,分塊進行 DCT 變換后,根據(jù) JPEG 標準量化表對變換系數(shù)進行量化,再對直流系數(shù)( DC) 進行預測編碼,對交流系數(shù)( AC) 行 zigzag 掃描和可變長編碼,然后根據(jù)標準的 Huffman 碼表進行熵編碼,輸出壓縮圖像的比特序列,實現(xiàn)了圖像的壓縮。
DCT 變換的特點是變換后圖像大部分能量集中在左上角,因為左上角反應原圖像低頻部分數(shù)據(jù),右下角反應原圖像高頻部分數(shù)據(jù),而圖像的能量通常集中在低頻部分。因此 DCT 變換后,只保留 DCT 系數(shù)矩陣最左上角的 10 個系數(shù),然后對每個圖像塊利用這 10個系數(shù)進行 DCT 反變換來重構圖像。
其基于 DCT 變換矩陣算法的處理過程如下圖:
?二、部分源代碼
close all;
clear all;
% Read the original images to the matrix orig_image;
clear orig_image;
clear temp_image;
temp_image = imread(‘image1.bmp’);
orig_image(:,:,:,1) = double(temp_image(:,:,:,1));
clear temp_image;
temp_image = imread(‘image2.bmp’);
orig_image(:,:,:,2) = double(temp_image(:,:,:,1));
clear temp_image;
temp_image = imread(‘image3.bmp’);
orig_image(:,:,:,3) = double(temp_image(:,:,:,1));
clear temp_image;
temp_image = imread(‘image4.bmp’);
orig_image(:,:,:,4) = double(temp_image(:,:,:,1));
% Image compression
% You are required to implement this part
% Note: The components of comp_image should be integers
starttime = cputime;
clear comp_image;
[comp_image_Y1,comp_image_U1,comp_image_V1] = Compress(orig_image(:,:,:,1));
[comp_image_Y2,comp_image_U2,comp_image_V2] = Compress(orig_image(:,:,:,2));
[comp_image_Y3,comp_image_U3,comp_image_V3] = Compress(orig_image(:,:,:,3));
[comp_image_Y4,comp_image_U4,comp_image_V4] = Compress(orig_image(:,:,:,4));
comp_size = comp_image_Y1.realsize+comp_image_U1.realsize+comp_image_V1.realsize;
%comp_image = zeros(comp_image_Y1.realsize,comp_image_U1.realsize,comp_image_V1.realsize);
% Image decompression
% You are required to implement this part
% Note: The components of reco_image shoud be integers
% The size of the reco_image should be same with the orig_image
clear reco_image;
s_image1 = Decompress(comp_image_Y1,comp_image_U1,comp_image_V1);
s_image2 = Decompress(comp_image_Y2,comp_image_U2,comp_image_V2);
s_image3 = Decompress(comp_image_Y3,comp_image_U3,comp_image_V3);
s_image4 = Decompress(comp_image_Y4,comp_image_U4,comp_image_V4);
%figure,imshow(s_image),title(‘jjiayatuxl’);
reco_image(:,:,:,1) = double(s_image1(:,:,:,1));
reco_image(:,:,:,2) = double(s_image2(:,:,:,1));
reco_image(:,:,:,3) = double(s_image3(:,:,:,1));
reco_image(:,:,:,4) = double(s_image4(:,:,:,1));
runtime = cputime - starttime;
% Check the size of the recovered image
clear sizevector1;
clear sizevector2;
[m1,m2,m3] = size(orig_image);
sizevector1 = size(orig_image);
sizevector2 = size(reco_image);
if sizevector1==sizevector2
else
disp(‘The size of the recovered image is not correct’);
end
?三、運行結果
?四、matlab版本及參考文獻
1 matlab版本
2014a
2 參考文獻
[1]馮飛,劉培學,李曉燕,嚴楠彬.離散余弦變換在圖像壓縮算法中的研究[J].計算機科學. 2016,43(S2)
3 備注
簡介此部分摘自互聯(lián)網(wǎng),僅供參考,若侵權,聯(lián)系刪除
總結
以上是生活随笔為你收集整理的【图像压缩】基于matlab余弦变换及霍夫曼编码jpeg压缩和解压【含Matlab源码 2086期】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 红楼梦诗词全集---留一份吧,太珍贵了!
- 下一篇: mysql insert on dupl