本章中,主要粗略练习图像压缩方面的知识。图像压缩分为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