Matlab DIP(瓦)ch8图像压缩练习 您所在的位置:网站首页 113:1压缩比 Matlab DIP(瓦)ch8图像压缩练习

Matlab DIP(瓦)ch8图像压缩练习

2024-01-14 17:48| 来源: 网络整理| 查看: 265

 

    本章中,主要粗略练习图像压缩方面的知识。图像压缩分为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 clc117 clear118 p=[1 2 3 4]119 p(1)=[]%此时p=2 3 4120 121 %%122 clc123 clear124 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,说明在编码和解码的过程中均方根误差为0138 139 %% 无损预测编码140 clc141 clear142 f=imread('.\images\dipum_images_ch08\Fig0807(c)(Aligned).tif')143 imshow(f);144 title('预测编码原图')

145 %其运行结果如下:146 147 fshang=entropy(f)%fsang=7.3505148 c0=mat2huff(double(f));149 cfshang=entropy(c0.code)%cfshang=7.9963150 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.0821158%其运行结果如下:

159 160 c=mat2huff(e);%将lpc编码后继续进行huffman编码161 ceshang=entropy(c.code)%7.9937162 cr=imratio(f,c)%1.3311163 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 clc181 clear182 f=imread('.\images\dipum_images_ch08\Fig0810(a)(Original).tif');183 q=quantize(f,4,'igs');%用该函数进行igs量化,量化到4bit184 qs=double(q)/16;185 e=mat2lpc(qs);186 c=mat2huff(e);187 imratio(f,c)%此处得到值为4.1420188 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 clc198 clear199 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.2450211 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 clc226 clear227 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.6241239 cr1=imratio(f,c1)%42.1589240 %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.9202249 cr2=imratio(f,c2)%87.7323250%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.7858259 cr3=imratio(f,c3)%1.6350260%1压缩后图像误差如下:

 

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有