根據相關參考資料說明,影像編碼解碼的大致結構框圖如下所示:

本系統,我們主要將完成這個結構框圖中介紹的各個模塊,

2.各個模塊設計與仿真
function im_encode(left_name, right_name, parameter);
發送端的說明
2.1 獲得左右兩個影像
·MATLAB代碼
imag_L = imread('stereo_images/corridor1.pgm');
imag_R = imread('stereo_images/corridor2.pgm');
figure(1);
subplot(121),imshow(imag_L);title('left');
subplot(122),imshow(imag_R);title('right');
·仿真效果

圖2 左右眼睛看到的影像
·代碼說明
通過讀取兩個圖片,來模擬人兩個眼睛所看到的影像,
2.2 Transform模塊
這個模塊主要使用DCT變換,但是這里設計到一個問題,就是將兩個圖片信號變為一路信號的問題,就本課題而言,這里有以下幾個方法實作;
·由于這兩個圖片是雙目信號,所以可以先進行立體匹配得到一個圖片,然后再接收端分解成兩個雙目圖片;
·由小波分解進行融合得到一路信號,然后在接收端進行反變換,但是這種做法也較復雜,
·進行圖片的采樣處理,對兩個圖片進行間隔采樣,然后在接收端進行內插得到原影像,這種方法比較簡單,本模塊采用這個方法,
其代碼如下所示:
[R,L] = size(imag_L);
for i = 1:R
for j = 1:L
if mod(i+j,2)==0
image(i,j) = imag_L(i,j);
else
image(i,j) = imag_R(i,j);
end
end
end
2.3 DCT變換
我們在這里使用MATLAB內部的dct2函式,這里就不多做介紹了,其仿真結果如下所示:

其代碼如下所示:
DCT_out = dct2(image);
2.4 ZIGZAG演算法
其基本原理如下所示:

通過這個方法,我們可以將一個影像的二維資料變為一個串行的資料流,
其對應的代碼如下所示:
function [y]=toZigzag(x)
% transform a matrix to the zigzag format
[row col]=size(x);
if row~=col
disp('toZigzag() fails!! Must be a square matrix!!');
return
end
y=zeros(row*col,1);
count=1;
for s=1:row
if mod(s,2)==0
for m=s:-1:1
y(count)=x(m,s+1-m);
count=count+1;
end;
else
for m=1:s
y(count)=x(m,s+1-m);
count=count+1;
end
end
end
if mod(row,2)==0
flip=1;
else
flip=0;
end
for s=row+1:2*row-1
if mod(flip,2)==0
for m=row:-1:s+1-row
y(count)=x(m,s+1-m);
count=count+1;
end
else
for m=row:-1:s+1-row
y(count)=x(s+1-m,m);
count=count+1;
end;
end;
flip=flip+1;
end

μ律(m-Law)壓擴主要用在北美和日本等地區的數字電話通信中,m為確定壓縮量的引數,它反映最大量化間隔和最小量化間隔之比,通常取100≤m≤500,由于m律壓擴的輸入和輸出關系是對數關系,所以這種編碼又稱為對數PCM,
A律(A-Law)壓擴主要用在歐洲和中國大陸等地區的數字電話通信中,A為確定壓縮量的引數,它反映最大量化間隔和最小量化間隔之比,A律壓擴的前一部分是線性的,其余部分與μ律壓擴相同,
15折線特性給出的小信號的信號量噪比約是13折線特性的兩倍, 但是,對于大信號而言,15折線特性給出的信號量噪比要比13折線特性時稍差,在保證小信號的量化間隔相等的條件下,均勻量化需要11位元編碼,而非均勻量化只要7位元就夠了,
其對應的待明如下所示:
function ypcm=mulaw(yn)
x=yn;
s=sign(x);
x=abs(x);
ypcm=zeros(length(x),1);
%進行基于15折線的分段映射
for i=1:length(x)
if x(i)<1/255 %序列值位于第1折線
ypcm(i)=255/8*x(i);
elseif x(i)<3/255 %序列值位于第2折線
ypcm(i)=255/16*x(i)+1/16;
elseif x(i)<7/255 %序列值位于第3折線
ypcm(i)=255/32*x(i)+5/32;
elseif x(i)<15/255 %序列值位于第4折線
ypcm(i)=255/64*x(i)+17/64;
elseif x(i)<31/255 %序列值位于第5折線
ypcm(i)=255/128*x(i)+49/128;
elseif x(i)<63/255 %序列值位于第6折線
ypcm(i)=255/256*x(i)+129/256;
elseif x(i)<127/255 %序列值位于第7折線
ypcm(i)=255/512*x(i)+321/512;
else %序列值位于第8折線
ypcm(i)=255/1024*x(i)+769/1024;
end
end
ypcm=ypcm.*(2^7);
ypcm=floor(ypcm);
ypcm=ypcm.*s;
2.6 編碼模塊
發送的最后我們需要將量化后的資料進行壓縮,得到二進制位元率進行發送,這里我們使用huffman編碼,Huffman編碼的基本原理如下所示:
哈夫曼編碼是用于資料檔案壓縮的一個十分有效的編碼方法,其壓縮率通常在20%~90%之間,哈夫曼編碼演算法使用字符在檔案中出現的頻率表來建立一個0,1串,以表示各個字符的最優表示方式,
它是一種編碼方式,哈夫曼編碼是可變字長編碼(VLC)的一種, Huffman于1952年提出一種編碼方法,該方法完全依據字符出現概率來構造異字頭的平均長 度最短的碼字,有時稱之為最佳編碼,一般就叫作Huffman編碼, 以哈夫曼樹─即最優二叉樹,帶權路徑長度最小的二叉樹,經常應用于資料壓縮, 在計算機資訊處理中,“哈夫曼編碼”是一種一致性編碼法(又稱"熵編碼法"),用于資料的無損耗壓縮,這一術語是指使用一張特殊的編碼表將源字符(例如某檔案中的一個符號)進行編碼,這張編碼表的特殊之處在于,它是根據每一個源字符出現的估算概率而建立起來的(出現概率高的字符使用較短的編碼,反之出現概率低的則使用較長的編碼,這便使編碼之后的字串的平均期望長度降低,從而達到無損壓縮資料的目的),這種方法是由David.A.Huffman發展起來的, 例如,在英文中,e的出現概率很高,而z的出現概率則最低,當利用哈夫曼編碼對一篇英文進行壓縮時,e極有可能用一個位(bit)來表示,而z則可能花去25個位(不是26),用普通的表示方法時,每個英文字母均占用一個位元組(byte),即8個位,二者相比,e使用了一般編碼的1/8的長度,z則使用了3倍多,倘若我們能實作對于英文中各個字母出現概率的較準確的估算,就可以大幅度提高無損壓縮的比例,
根據變長最佳編碼定理,Huffman編碼步驟如下:
(1)將信源符號xi按其出現的概率,由大到小順序排列,
(2)將兩個最小的概率的信源符號進行組合相加,并重復這一步驟,始終將較大的概率分支放在上部,直到只剩下一個信源符號且概率達到1.0為止;
(3)對每對組合的上邊一個指定為1,下邊一個指定為0(或相反:對上邊一個指定為0,下邊一個指定為1);
(4)畫出由每個信源符號到概率1.0處的路徑,記下沿路徑的1和0;
(5)對于每個信源符號都寫出1、0序列,則從右到左就得到非等長的Huffman碼,
其對應的代碼如下所示:
function [compression,dict] = huffman_module(image);
s = image;
%entropy
p = hist(s,length(s));
idx=find(p~=0);
prob=p(idx)/length(s);
entropy=-prob*log2(prob)';
%redundancy
entropymax=log2(length(prob));
redundancy=(entropymax-entropy)/entropymax;
reff=sort(s);
ref2=reff(2:end);
ref=reff(1:end-1);
chg=ref2-ref;
idx2=find(chg~=0);
sig=ref2(idx2);
symbols=[ref(1);sig];
%huffman table
set(0,'RecursionLimit',2000);
[dict,avglen] = huffmandict(symbols,prob);
% %huffman encoder
compression = huffmanenco(s,dict);
3.各個模塊設計與仿真
3.系統總體仿真說明
系統的仿真結果如下所示:

讀入兩個圖片
DCT變換值

量化值

壓縮位元流

最后接收到的雙目圖片,

最后我們可以得到PSNR值為


轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/143145.html
標籤:其他
上一篇:初學者JAVA99乘法表
