Matlab實現(xiàn)圖像壓縮

文章和代碼以及樣例圖片等相關資源,已經(jīng)歸檔至【Github倉庫:digital-image-processing-matlab】或者【AIShareLab】回復 數(shù)字圖像處理 也可獲取。

目的

1. 理解圖像壓縮的相關概念及圖像壓縮的主要原則和目的;
2. 掌握霍夫曼編碼
3. 掌握幾種常見的圖像壓縮編碼方法
4. 利用 MATLAB 程序進行圖像壓縮

原理

圖像壓縮原理

圖像壓縮主要目的是為了節(jié)省存儲空間,增加傳輸速度。圖像壓縮的理想標準是信息丟失最少,壓縮比例最大。不損失圖像質(zhì)量的壓縮稱為無損壓縮,無損壓縮不可能達到很高的壓縮比;損失圖像質(zhì)量的壓縮稱為有損壓縮,高的壓縮比是以犧牲圖像質(zhì)量為代價的。壓縮的實現(xiàn)方法是對圖像重新進行編碼,希望用更少的數(shù)據(jù)表示圖像。

信息的冗余量有許多種,如空間冗余,時間冗余,結(jié)構(gòu)冗余,知識冗余,視覺冗余等,數(shù)據(jù)壓縮實質(zhì)上是減少這些冗余量。高效編碼的主要方法是盡可能去除圖像中的冗余成分,從而以最小的碼元包含最大的圖像信息。

編碼壓縮方法有許多種,從不同的角度出發(fā)有不同的分類方法,從信息論角度出發(fā)可分為兩大類。

(1)冗余度壓縮方法,也稱無損壓縮、信息保持編碼或嫡編碼。具體說就是解碼圖像和壓縮編碼前的圖像嚴格相同,沒有失真,從數(shù)學上講是一種可逆運算。

(2)信息量壓縮方法,也稱有損壓縮、失真度編碼或煙壓縮編碼。也就是說解碼圖像和原始圖像是有差別的,允許有一定的失真。

應用在多媒體中的圖像壓縮編碼方法,從壓縮編碼算法原理上可以分為以下 3 類:

(1)無損壓縮編碼種類
哈夫曼(Huffman)編碼,算術編碼,行程(RLE)編碼,Lempel zev 編碼。

(2)有損壓縮編碼種類

  • 預測編碼,DPCM,運動補償

  • 頻率域方法:正交變換編碼(如DCT),子帶編碼;

  • 空間域方法:統(tǒng)計分塊編碼;

  • 模型方法:分形編碼,模型基編碼;

  • 基于重要性:濾波,子采樣,比特分配,向量量化;

(3)混合編碼。 有 JBIG,H261,JPEG,MPEG 等技術標準。

離散余弦變換(DCT)圖像壓縮原理

離散余弦變換 DCT 在圖像壓縮中具有廣泛的應用,它是JPEG、MPEG 等數(shù)據(jù)壓縮標準的
重要數(shù)學基礎。

和相同圖像質(zhì)量的其他常用文件格式(如GIF(可交換的圖像文件格式),TIFF(標簽圖像文件格式),PCX(圖形文件格式))相比,JPEG 是目前靜態(tài)圖像中壓縮比最高的。JPEG 比其他幾種壓縮比要高得多,而圖像質(zhì)量都差不多(JPEG 處理的圖像只有真彩圖和灰度圖)。正是由于其高壓縮比,使得JPEG 被廣泛地應用于多媒體和網(wǎng)絡程序中。JPEG 有幾種模式,其中最常用的是基于DCT 變換的順序型模式,又稱為基本系統(tǒng)(Baseline)。

用DCT 壓縮圖像的過程為:

(1)首先將輸入圖像分解為8×8 或16×16 的塊,然后對每個子塊進行二維DCT變換。
(2)將變換后得到的量化的DCT 系數(shù)進行編碼和傳送,形成壓縮后的圖像格式。

用 DCT 解壓的過程為:

(1)對每個8×8 或16×16 塊進行二維DCT 反變換。
(2)將反變換的矩陣的塊合成一個單一的圖像。

余弦變換具有把高度相關數(shù)據(jù)能量集中的趨勢,DCT 變換后矩陣的能量集中在矩陣的
左上角,右下的大多數(shù)的DCT 系數(shù)值非常接近于0。對于通常的圖像來說,舍棄這些接近
于0 的DCT 的系數(shù)值,并不會對重構(gòu)圖像的畫面質(zhì)量帶來顯著的下降。所以,利用DCT
變換進行圖像壓縮可以節(jié)約大量的存儲空間。壓縮應該在最合理地近似原圖像的情況下使用
最少的系數(shù)。使用系數(shù)的多少也決定了壓縮比的大小。

在壓縮過程的第 2 步中,可以合理地舍棄一些系數(shù),從而得到壓縮的目的。在壓縮
過程的第2 步,還可以采用RLE 和Huffman 編碼來進一步壓縮。

行程編碼(RLE)原理

例如如下這幅的二值圖像,

[圖片上傳失敗...(image-c56dbf-1678149990054)]

如果采用行程編碼可以按如下格式保存

[圖片上傳失敗...(image-e20741-1678149990054)]

其中10 和8 表示圖像的寬和高。在這個小例子中行程編碼并沒有起到壓縮圖像的作用。這是由于這個圖的尺寸過小,當圖像尺寸較大時行程編碼還是不錯的無損壓縮方法。對于灰度圖像和二值圖像,用行程編碼—般都有很高的壓縮率。行程編碼方法實現(xiàn)起來很容易,對于具有長重復值的串的壓縮編碼很有效,例如:對于有大面積的陰影或顏色相同的圖像,使用這種方法壓縮效果很好。很多位圖文件格式都采用行程編碼,如TIFF,PCX,GEM,BMP等。

步驟

MATLAB 中的變長碼映射

clear all
clc


f2=uint8([2 3 4 2;3 2 4 4;2 2 1 2;1 1 2 2])
whos('f2')
c=huffman(hist(double(f2(:)),4))
h1f2=c(f2(:))'
whos('h1f2')
%h2f2=char(h1f2)'
h2f2=[1 0 1 0 0 1 1 0 0 0 0 1 1 0 1 1;...
' ' 1 ' ' 1 1 ' ' 1 0 0 1 ' ' 0 ' ';...
' ' 0 ' ' 1 0 ' ' 1 ' ' 1 ' ']
whos('h2f2')

h2f2=h2f2(:);
h2f2(h2f2==' ')=[];
whos('h2f2')

h3f2=mat2huff(f2)
whos('h3f2')

hcode=h3f2.code;
whos('hcode')
dec2bin(double(hcode))

%-----------------------------------------%
function CODE=huffman(p)

error(nargchk(1,1,nargin));
if(ndims(p)~=2)|(min(size(p))>1)|~isreal(p)|~isnumeric(p)
    error('p must be a real numeric vector');
end

global CODE
CODE=cell(length(p),1);%init the global cell array
if (length(p)>1) %when more than one symbol....
    p=p/sum(p);%Normalize the input probabilities
    s=reduce(p);%Do Huffman source symbol reductions
    makecode(s,[]);%Recursively(遞歸) generate the code
else
    CODE={'1'};%else, trivial(普通的) one symbol case
end;
%---------------------------------------------------------%

function s=reduce(p);
s=cell(length(p),1);
for i=1:length(p)
    s{i}=i;
end

while size(s)>2
    [p,i]=sort(p);%sort the symbol probabilities
    p(2)=p(1)+p(2);%Merge the 2 lowest probabilities
    p(1)=[];% and prune(,剪除、刪除) the lowest one

    s=s(i);
    s{2}={s{1},s{2}};
    s(1)=[];
end
%------------------------------------------------------------%
function makecode(sc,codeword)

global CODE
if isa(sc,'cell')
    makecode(sc{1},[codeword 0]);
    makecode(sc{2},[codeword 1]);
else
    CODE{sc}=char('0'+codeword);
End
%-----------------------------------------------------------%
function y=mat2huff(x)

if ndims(x)~=2|~isreal(x)|(~isnumeric(x) & ~islogical(x))
    error('x must be a 2-D real numeric or logical matrix');
end

y.size=uint32(size(x));
x=round(double(x));
xmin=min(x(:));
xmax=max(x(:));
pmin=double(int16(xmin));
pmin=uint16(pmin+32768);%
y.min=pmin;
x=x(:)';
h=histc(x,xmin:xmax);
if max(h)>65535
    h=65535*h/max(h);
end
h=uint16(h);
y.hist=h;

%code the input matrix and store the result
map=huffman(double(h));
hx=map(x(:)-xmin+1)
hx = ['1' ' ' '1' '0' ' ' '1' '1' '0' ' ' ' '...
    '0' '1' '1' ' ' '1' '1']';
%hx=char(hx);
hx=hx(:)';
hx(hx==' ')=[];
ysize=ceil(length(hx)/16);
hx16=repmat('0',1,ysize*16);
hx16(1:length(hx))=hx;
hx16=reshape(hx16,16,ysize);
hx16=hx16' - '0';
twos=pow2(15:-1:0);
y.code=uint16(sum(hx16.*twos(ones(ysize,1),:),2))';
%-----------------------------------------------------------------------%

離散余弦變換(DCT)圖像壓縮

在圖像的變換和壓縮中,常常用到離散余弦變換(DCT)。DCT 具有能使圖像的最重要的信息集中在DCT 的幾個系數(shù)上的性能。正是基于此,DCT 通常應用于圖像的壓縮。

clear all
clc
I=imread('D:\pic\DIP3E_CH11_Original_Images\Fig1137(b)(painting_translated_padded).tif','tif');

I=im2double(I);
T=dctmtx(8);
B=blkproc(I,[8,8],'P1*x*P2',T,T');
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);
I2=blkproc(B2,[8,8],'P1*x*P2',T',T);
imshow(I),title('原圖象');
figure,imshow(I2),title('變換后的圖象');

利用離散余弦變換進行JPEG 圖像壓縮

clear all
clc
I=imread('D:\pic\DIP3E_CH11_Original_Images\Fig1137(b)(painting_translated_padded).tif'); %讀入原圖像;
I=im2double(I); %將原圖像轉(zhuǎn)為雙精度數(shù)據(jù)類型;
T=dctmtx(8); %產(chǎn)生二維DCT 變換矩陣
B=blkproc(I,[8 8],'P1*x*P2',T,T'); %計算二維DCT,矩陣T 及其轉(zhuǎn)置T’是DCT 函數(shù)
%P1*x*P2 的參數(shù)
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];
%二值掩膜,用來壓縮DCT 系數(shù),只留下DCT 系數(shù)中左上角的10 個
B2=blkproc(B,[8 8],'P1.*x',mask); %只保留DCT 變換的10 個系數(shù)
I2= blkproc(B2,[8,8],'P1*x*P2',T',T); %逆DCT,重構(gòu)圖像
Subplot(1,2,1);
Imshow(I);title('原圖像');%顯示原圖像
Subplot(1,2,2);
Imshow(I2);title('壓縮圖像');%顯示壓縮后的圖像。對比原始圖像和壓縮后的圖像,雖然
%舍棄了85%的DCT 系數(shù),但圖像仍然清晰(當然有一些質(zhì)量損失)

參考文獻:

[1] Rafael C. Gonzalez, Richard E. Woods, and Steven L. Eddins. 2003. Digital Image Processing Using MATLAB. Prentice-Hall, Inc., USA.

[2] 阮秋琦. 數(shù)字圖像處理(MATLAB版)[M]. 北京:電子工業(yè)出版社, 2014.

[3] 岡薩雷斯. 數(shù)字圖像處理(第三版)[M]. 北京:電子工業(yè)出版社, 2011.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容