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压缩后图像误差如下:



复制代码

 

   练习得比较基本,很多函数内部的代码没有分析,等功底深些再学习吧。

作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:tornadomeet,欢迎交流!)
http://www.cnblogs.com/tornadomeet/archive/2012/03/17/2403964.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值