本章中,主要粗略练习图像压缩方面的知识。图像压缩分为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压缩后图像误差如下:
练习得比较基本,很多函数内部的代码没有分析,等功底深些再学习吧。