zoukankan      html  css  js  c++  java
  • 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压缩后图像误差如下:

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

  • 相关阅读:
    Training: WWW-Robots
    Training: Stegano I
    Encodings: URL
    利用Nginx实现域名转发 不修改主机头
    C++删除目录和复制目录函数
    获取文件大小的函数
    日志打印函数
    拉起上级目录程序
    安卓TabHost页面
    有趣的人形时钟
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2403964.html
Copyright © 2011-2022 走看看