数字图像处理实验6图像编码
一、實驗目的
(1)了解圖像編碼的目的及意義,加深對圖像編碼的感性認識。
(2)熟練掌握哈夫曼編碼的實現與應用。
(3)掌握行程長度編碼的實現與應用,尤其是BMP和PCX文件的行程長度編碼*。
二、實驗內容
(1)選擇圖像,對其進行哈夫曼編碼,總結哈夫曼編碼的壓縮思想。
(2)選擇圖像,對其進行行程編碼,觀察將圖像保存為PCX文件后,圖像占用空間的變化,并總結PCX的編碼特點*三、實驗代碼及結果、分析
三、實驗原理、代碼、結果、分析
(1)哈夫曼編碼
- 原理:η
哈夫曼編碼是一種無損編碼,依據信源符號出現的概率來構造其碼字,對出現概率大的字符使用較短的碼字,對出現概率低的字符則使用較長的碼字,從而達到壓縮數據的目的,哈夫曼編碼又稱為最佳編碼。
編碼的基本步驟:
- 代碼:
HuffmanCode.m:
I=imread('lena.jpg');
Gray=rgb2gray(I);
[zipped,info]=huffencode(Gray);%調用哈夫曼編碼程序進行壓縮
unzipped=huffdecode(zipped,info);%調用哈夫曼解碼程序進行解碼
disp('平均碼長');L=info.avalen
disp('壓縮比');CR=info.ratio
disp('信息熵');H=info.h
disp('編碼效率');CE=info.ce
subplot(131);imshow(Source);title('原始圖像');
subplot(132);imshow(Gray);title('灰度圖像');
subplot(133);imshow(unzipped);title('哈夫曼編碼并解碼重構圖像');
huffencode.m與huffdecode.m實際代碼展示一部分:
info.zeropad=zp;%添加的比特數
info.huffcodes=huffcodes;
info.length=length(vector);%灰度圖矩陣長度
info.rows=m;
info.cols=n;
info.avalen=avawordlen;%平均碼長
info.ratio=8/avawordlen;%壓縮比
info.h=H;
info.ce=H/avawordlen;%編碼效率
- 結果:
平均碼長L = 7.4626
壓縮比CR =1.0720
信息熵H =7.4384
編碼效率CE =0.9968
- 分析:
1、哈夫曼編碼是無失真編碼,則原始矩陣與解碼之后的矩陣相同
?
?
- 3、當圖像灰度值分布不均勻時,哈夫曼編碼效率比較高,如該題中,編碼效率達到的99.7%
4、哈夫曼編碼方法對圖像數據進行編碼時,須兩次讀取圖像數據,第一次是為了計算每個數據出現的概率,并對各數據進行排序,第二次讀取數據轉換表格中的編碼值代替圖像數據存入圖像編碼文件中
(2)行程編碼
- 原理:
僅存儲一個像素值以及具有相同顏色的像素數目的圖象數據編碼方式稱為行程編碼,或稱游程編碼,常用RLE(Run-Length Encoding)表示,是一種統計編碼,該編碼屬于無損壓縮編碼,對于二值圖有效。在此方式下每兩個字節組成一個信息單元。第一個字節給出其后面相連的象素的個數,第二個字節給出這些象素使用的顏色索引表中的索引。游程編碼所能獲得的壓縮比有多大,主要取決于圖像本身的特點。如果圖像中具有相同顏色的圖像塊越大,圖像塊數目越少,獲得的壓縮比就越高。反之,壓縮比就越小
- 代碼:
clc;clear('all');close all;
Source=imread('lena.png'); %讀入圖像 ?
Gray=rgb2gray(Source);
%以下程序為對原圖像進行行程編碼,壓縮 ?
Gray_Linear=Gray(:); ?
Gray_Length=length(Gray_Linear); ?
j=1; ?index(1)=1; ?
for z=1:1:(length(Gray_Linear)-1) %行程編碼程序段 ?
????if Gray_Linear(z)==Gray_Linear(z+1); ?
????????index(j)=index(j)+1; ?
????else ?
????????Encode(j)=Gray_Linear(z);
????????j=j+1; ?
????????index(j)=1;
????end ?
end
Encode(j)=Gray_Linear(length(Gray_Linear)); ??%最后一個像素數據
index=uint8(index);
k=1;
for i=1:1:j
????if index(i)==1
????????Encode_hex(k)=Encode(i);???% 十六進制的次數或者灰度值
????????k=k+1;
????else
????????Encode_hex(k)=192+index(i);
????????k=k+1;
????????Encode_hex(k)=Encode(i);
????????k=k+1;
????end
end
Encode_hex=dec2hex(Encode_hex);
Encode_hex_Length=size(Encode_hex,1);%計算行程編碼后的所占字節數,Encode_hex_Length
index_Lenght=length(index); ?
CR=Gray_Length/Encode_hex_Length; ??%比較壓縮前與壓縮后的大小 ?
%行程編碼解碼 ?
l=1; ?
for m=1:index_Lenght ?
????for n=1:1:index(m) ?
????????Decode_temp(l)=Encode(m);
????????l=l+1; ?
????end ?
end ?
Decode=reshape(Decode_temp,500,500); ???%重建二位圖像數組 ?
figure(1);
subplot(121);imshow(Gray);title('原始灰度圖'); ???%顯示原圖的二值圖像 ?
subplot(122);imshow(Decode);title('解壓縮恢復后的圖像'); ?%顯示解壓縮恢復后的圖像 ?
disp('壓縮比:'); ?
disp(CR); ?
disp('原圖像數據的長度:'); ?
disp(Gray_Length); ?
disp('壓縮后圖像數據的長度'); ?
disp(Encode_hex_Length); ?
disp('解壓縮后的數據長度'); ?
disp(length(Decode_temp));
- 結果:
? ? ? ??
?
原圖像數據的長度:250000
壓縮后圖像數據的長度:229014
解壓縮后的數據長度:250000
壓縮比:1.0916
- 分析:
? ? ? ?2.行程編碼的實驗結果可根據以下三個圖來得到:
index對應Encode相應列灰度值出現的次數,Encode_hex表示編碼之后的十六進制
(2,162)-----(1100_0010,1010_0010)---(C2,A2)
(1,163)-----A3
(2,164)-----(1100_0010,1010_0100)---(C2,A4)
(1,163)-----A3
(2,162)-----(1100_0010,1010_0010)---(C2,A2)
(1,154)-----9A
(1,155)-----9B
(4,156)-----(1100_0100,1001_1010)---(C4,9C)......
行程編碼則用(次數十六進制,灰度值十六進制)表示:
- 當灰度值出現的次數大于1小于等于63時,前一個字節表示出現的次數,且前兩位為11,后一個字節表示本來的數據;
- 當灰度值出現的次數大于63時,將這個數據出現的數據分為幾部分;
- 當只出現1次時,數據大于或等于C0時,仍用兩個字節表示,(C1,數據),小于C0時,直接用數據表示
?
?
總結
以上是生活随笔為你收集整理的数字图像处理实验6图像编码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ScrollView与TableView
- 下一篇: 环信SDK集成