Matlab DIP(瓦)ch8圖像壓縮練習


 

    本章中,主要粗略練習圖像壓縮方面的知識。圖像壓縮分為3部分,編碼壓縮,像素間冗余壓縮,心理視覺冗余壓縮。編碼主要分為線性預測編碼,哈弗曼編碼,已經JPEG和JPEG2000等。

練習代碼和解釋如下:

  1 %第八章  圖像壓縮
2 10 %% entropy熵
11 clc
12 clear
13 f=[119 123 168 119;123 119 168 168]
14 f=[f;119 119 107 119;107 107 119 119]%不想分行的寫法
15 h1=entropy(f,8)%直接算其8個bin的熵
16 %%h1=1.7806
17
18 %[p x]=hist(Y,X),如果X是一個標量,則表示將Y列向量均分為X個斌
19 %p返回每一個bin中對應數量,x返回每一個bin的中心位置
20 [p x]=hist(f(:),8)
21 hist(f(:),8)%沒有單獨寫返回值的情況下就是畫出f的直方圖
22 title('向量f的直方圖顯示')


23 p=p/sum(p)%直方圖bin中個數與總個數之比
24 %p =
25 % 0.1875 0.5000 0.1250 0 0 0 0 0.1875
26 h2=entropy(f)%其計算方法為h=-sum([p(i).*log2(p(i)));
27 %h2=1.7806,結果與h1是一樣的
28 c=huffman(hist(double(f(:)),4))
29 %其中hist(double(f(:)),4)為11 2 0 3,所以
30 %計算出來的其haffman編碼為按其順序給的
31 %c =
32 % '1'
33 % '001'
34 % '000'
35 % '01'
36 cp=huffman([0.1875 0.5 0.125 0.1875])
37 %cp =
38 % '011'
39 % '1'
40 % '010'
41 % '00'
42
43 %% huffman
44 clc
45 clear
46 f2=uint8([2 3 4 2;3 2 4 2;2 2 1 2;1 1 2 2])
47 R1=whos('f2')
48 %運行結果如下:
49


50 c=huffman(hist(double(f2(:)),4))
51 %c= '00'
52 % '1'
53 % '010'
54 % '011'
55 h1f2=c(f2(:))'%g該句的作用就是將f2中的元素按照c來查表
56 whos('h1f2');%可以看出其存儲空間用了1014個字節


57
58 h2f2=char(h1f2)'%此處需要轉置是因為char函數把包元數組轉換成行向量
59 %h2f2=
60 %1010011000011111
61 % 1 01 0110
62 % 0 0 11
63 whos('h2f2')%可以看到此處仍然用了96個bytes
64 %運行結果如下:
65


66 h2f2=h2f2(:)
67 h2f2(h2f2==' ')=[];%此處單引號內的空格不能少
68 whos('h2f2');
69 %運行結果如下:
70


71 h3f2=mat2huff(f2)%該函數的功能是用huffman編碼一個矩陣
72 whos('h3f2');%雖然返回的需要128個字節,不過主要是應用於結構的開銷
73%運行結果如下:


74
75 hcode=h3f2.code;
76 whos('hcode')%可以看出壓縮比接近4:1
77%運行結果如下:


78
79 dec2bin(double(hcode))%轉換成二進制
80 %運行結果如下:
81


82 %% cell數據結果的理解
83 clc
84 clear
85 X=cell(2,3)%注意雖然X是2行3列,但是其順序是從上到下,從左到右的
86 X{1}={8,9}
87 X{1}
88 X(1)
89
90 X{2}=5
91 X{2}
92 X(2)
93
94 X(3)={6}
95 X{3}
96 X(3)
97
98 X(4)={[7 9]}
99 X{4}
100 X(4)
101
102 X{5}={[10,11]}
103 X{5}
104 X(5)
105
106 X{6}=[12,13]
107 X{6}
108 X(6)
109
110 celldisp(X)%列出每一個包元的數值
111 cellplot(X)%畫出包元的結構圖
112 title('cell示意圖')
113%其運行結果如下:


114
115 %% 剪去第一個元素的方法
116 clc
117 clear
118 p=[1 2 3 4]
119 p(1)=[]%此時p=2 3 4
120
121 %%
122 clc
123 clear
124
125 %編碼:
126 f1=imread('.\images\dipum_images_ch08\Fig0804(a)(Tracy).tif');
127 c=mat2huff(f1)
128 cr1=imratio(f1,c)
129
130 save .\Data\SqueezeTracy.mat;
131 cr2=imratio('.\images\dipum_images_ch08\Fig0804(a)(Tracy).tif','.\Data\SqueezeTracy.mat')
132 %可以看出2者的壓縮比是不同的,主要差別在matlab數據文件的開銷
133
134 %解碼:
135 load .\Data\SqueezeTracy.mat;
136 g=huff2mat(c);
137 rmse=compare(f1,g)%可以看出rmse=0,說明在編碼和解碼的過程中均方根誤差為0
138
139 %% 無損預測編碼
140 clc
141 clear
142 f=imread('.\images\dipum_images_ch08\Fig0807(c)(Aligned).tif')
143 imshow(f);
144 title('預測編碼原圖')


145 %其運行結果如下:
146
147 fshang=entropy(f)%fsang=7.3505
148 c0=mat2huff(double(f));
149 cfshang=entropy(c0.code)%cfshang=7.9963
150 cfr=imratio(f,c0)%cfr=1.0821,即huffman編碼后熵變大
151
152 %預測編碼
153 e=mat2lpc(f);
154 figure,imshow(mat2gray(e));
155 title('線性預測編碼后圖');
156 esgang=entropy(e)%esang=5.9727,變小
157 cer=imratio(f,unit8(e))%cer=1.0821
158%其運行結果如下:


159
160 c=mat2huff(e);%將lpc編碼后繼續進行huffman編碼
161 ceshang=entropy(c.code)%7.9937
162 cr=imratio(f,c)%1.3311
163
164 %解碼
165 ee=huff2mat(c);
166 ff=lpc2mat(ee);
167 figure,imshow(ff,[])
168 title('解碼后圖')


169
170 [h,x]=hist(e(:)*512,512);
171 figure,bar(x,h,'k');
172 set(gcf,'outerposition',get(0,'screensize'))%設置目標的屬性
173 title('預測誤差的直方圖')
174%其運行結果如下:


175
176 g=lpc2mat(huff2mat(c));
177 compare(f,g)%值為0,無損還原
178
179 %% 利用無損預測和霍夫編碼混合的IGS(改進的灰度級)量化
180 clc
181 clear
182 f=imread('.\images\dipum_images_ch08\Fig0810(a)(Original).tif');
183 q=quantize(f,4,'igs');%用該函數進行igs量化,量化到4bit
184 qs=double(q)/16;
185 e=mat2lpc(qs);
186 c=mat2huff(e);
187 imratio(f,c)%此處得到值為4.1420
188
189 %解壓縮(無反變換)
190 ne=huff2mat(c);
191 nqs=lpc2mat(ne);
192 nq=16*nqs;
193 compare(q,nq)%無損預測和霍夫編碼不會產生灰度級誤差
194 rmse=compare(f,nq)%rmse=6.8382,說明誤差有7個灰度級
195
196 %%JPEG壓縮
197 clc
198 clear
199 f=imread('.\images\dipum_images_ch08\Fig0804(a)(Tracy).tif');
200 imshow(f);
201 title('JPEG壓縮前圖像');
202%其運行結果如下:


203
204 c1=im2jpeg(f);
205 f1=jpeg2im(c1);
206 figure,imshow(f1);
207 title('JPEG壓縮后圖像');%肉眼看不出太大的區別
208%其運行結果如下:


209
210 imratio(f,c1)%壓縮比約為18.2450
211 compare(f,f1,3)%2.4329,compare函數的功能是計算並顯示在Scale等級2個矩陣直接的錯誤
212 %其運行結果如下:

213
214 c4=im2jpeg(f,4)
215 f4=jpeg2im(c4);
216 figure,imshow(f)
217 title('標准化數組乘以4后')
218%其運行結果如下:

 


219
220 imratio(f,c4)
221 compare(f,f4,3)
222 %其運行結果如下:
223
224 %% JPEG2000壓縮
225 clc
226 clear
227 f=imread('.\images\dipum_images_ch08\Fig0804(a)(Tracy).tif');
228 imshow(f);
229 title('JPEG2000壓縮前圖像');
230 %其運行結果如下:
231


232 c1=im2jpeg2k(f,5,[8 8.5]);%使用5尺度變換,參數為[8 8.5]的隱式量化
233 f1=jpeg2k2im(c1);
234 figure,imshow(f1);
235 title('JPEG2000壓縮后圖像(8.5)');
236%其運行結果如下:


237
238 rms1=compare(f,f1)%3.6241
239 cr1=imratio(f,c1)%42.1589
240 %8.5壓縮后圖像誤差如下:
241
242 c2=im2jpeg2k(f,5,[8 7]);%使用5尺度變換,參數為[8 8.5]的隱式量化
243 f2=jpeg2k2im(c2);
244 figure,imshow(f2);
245 title('JPEG2000壓縮后圖像(7)');
246%其運行結果如下:


247
248 rms2=compare(f,f2)%5.9202
249 cr2=imratio(f,c2)%87.7323
250%7壓縮后圖像誤差如下:


251
252 c3=im2jpeg2k(f,1,[1 1 1 1]);%使用5尺度變換,參數為[8 8.5]的隱式量化
253 f3=jpeg2k2im(c3);
254 figure,imshow(f3);
255 title('JPEG2000壓縮后圖像(1)');
256%其運行結果如下:


257
258 rms3=compare(f,f3)%0.7858
259 cr3=imratio(f,c3)%1.6350
260%1壓縮后圖像誤差如下:

 

   練習得比較基本,很多函數內部的代碼沒有分析,等功底深些再學習吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM