【Matlab 024期】Matlab影象處理教程系列之影象壓縮
數字影象通常需要很大的位元數,這給影象的傳輸和儲存帶來相當大的困難。例如用8bit儲存一幅512512的灰度影象的位元數為256K。而一部60分鐘的彩色電影,如果每秒放映24幀,數字化後每幀包含512512畫素,每畫素的R、G、B分量分別佔8bit,則這樣一部電影的總位元數為64800M,若用一張600M的CD儲存則需要100多張CD光碟來儲存。由此可見對影象資料進行壓縮顯得非常必要。減少儲存空間、縮短傳輸時間這成為促進影象壓縮編碼技術發展的主導因素。影象壓縮是通過編碼來實現的,所以通常將壓縮與編碼統稱為影象的壓縮編碼。影象壓縮編碼從本質上來說就是對要處理的影象資料按照一定的規則進行變換和組合,從而達到以儘可能少的資料來表示儘可能多的資料資訊。
1.資料的冗餘
大多數資訊的表達都存在著一定的冗餘度(相關性),通過採用一定的模型和編碼方法,可以降低這種冗餘度。
設:為表達一個資訊,方法A用了n1個數據,改進方法B用了n2個數據(壓縮資料):
壓縮率(壓縮比):C = n1 / n2
相對資料冗餘:R = 1 – 1/C
2.影象資料中的冗餘
三種資料冗餘:編碼冗餘、畫素冗餘、視覺心理冗餘
(1)編碼冗餘:如果一個影象的灰度級編碼,使用了多於實際需要的編碼符號,就稱該影象包含了編碼冗餘。
(2)畫素冗餘(畫素間相關)
任何給定位置畫素值,原理上均與相鄰畫素相關,都可以通過它的鄰居預測到,單個畫素攜帶的資訊相對較少。
對於一幅影象,大量單個畫素對視覺的貢獻是冗餘的。這是建立在對鄰居值預測的基礎上。
例:原影象資料:234 223 231 238 235
壓縮後資料: 234 -11 8 7 -3
(3)視覺心理冗餘
一些資訊在一般視覺處理中比其它資訊的相對重要程度要小,這種資訊就被稱為視覺心理冗餘。
人類的視覺系統由於受生理特性的限制,對於影象場的注意是非均勻的,人對細微的顏色差異感覺不明顯。 例如,人類視覺的一般分辨能力為26灰度等級,而一般的影象的量化採用的是28灰度等級,即存在視覺冗餘。 人類的聽覺對某些訊號反映不太敏感,使得壓縮後再還原有允許範圍的變化,人也感覺不出來。
3.利用影象資料的冗餘開展壓縮
(1)因為有編碼冗餘和畫素冗餘,當我們將影象資訊的描述方式改變之後,可以壓縮掉這些冗餘,進行“無損”壓縮。
(2)因為有主觀視覺冗餘,當我們忽略一些視覺不太明顯的微小差異,可以進行所謂的“有損”壓縮。
close all; clear all; clc;
I=imread('lena.jpg'); %讀入影象
I1=rgb2gray(I);
I2=I1(:); %將原始影象寫成一維的資料並設為 I2
I2length=length(I2); %計算 I2 的長度
I3=im2bw(I1,0.5); %將原圖轉換為二值影象,閾值為 0.5
%以下程式為對原影象進行行程編碼,壓縮
X=I3(:); %令 X 為新建的二值影象的一維資料組
L=length(X);
j=1;
I4(1)=1;
for z=1:1:(length(X)-1) %行程編碼程式段
if X(z)==X(z+1)
I4(j)=I4(j)+1;
else
data(j)=X(z); % data(j)代表相應的畫素資料
j=j+1;
I4(j)=1;
end
end
data(j)=X(length(X)); %最後一個畫素資料賦給 data
I4length=length(I4); %計算行程編碼後的所佔位元組數,記為 I4length
CR=I2length/I4length; %比較壓縮前於壓縮後的大小
%下面程式是行程編碼解壓
l=1;
for m=1:I4length
for n=1:1:I4(m);
decode_image1(l)=data(m);
l=l+1;
end
end
decode_image=reshape(decode_image1,256,256); %重建二維影象陣列
h=figure,set(h,'color','white')
x=1:1:length(X);
subplot(131),plot(x,X(x)); %顯示行程編碼之前的影象資料
y=1:1:I4length ;
subplot(132),plot(y,I4(y)); %顯示編碼後資料資訊
u=1:1:length(decode_image1);
subplot(133),plot(u,decode_image1(u)); %檢視解壓後的影象資料
h=figure;
subplot(131);imshow(I); %顯示原圖的二值影象
subplot(132);imshow(I3); %顯示原圖的二值影象
subplot(133),imshow(decode_image); %顯示解壓恢復後的影象
set(h,'color','white')
disp('壓縮比: ')
disp(CR);
disp('原影象資料的長度:')
disp(L);
disp('壓縮後圖像資料的長度:')
disp(I4length);
disp('解壓後圖像資料的長度:')
disp(length(decode_image1));
注:完整程式碼或者代寫新增QQ2449341593