Image Compression
图像压缩
Overview
熵编码
熵编码或统计编码属于无损编码,给出现概率较大的符号赋予一个短码字,给出现概率较小的符号赋予一个长码字,从而使最终的平均码长很小。主要的熵编码方法包括哈夫曼编码、香农编码、算术编码等。
哈夫曼编码
扫描各种颜色的像素出现的概率,然后按照概率大小组成哈夫曼编码。(个人感觉意义不大)

算术编码
个人觉得也意义不大,跳过吧
RLE编码
比较简单,也可以略
行程长度编码(Run- Length Encoding,RLE)压缩算法是Windows系统中使用的一种图像文件压缩方法
例如:RRRRRGGBBBBBB -> 5R2G6B
LZW编码
wiki[1], 各种版本的 LZW 实现[2], geeksforgeeks[3]
数据流(CharStream):对象(文本文件的数据序列)
编码流(CodeStream):输出对象(经过压缩运算的编码数据)
编译表(String Table):编译表不是事先创建好的,而是根据原始文件数据动态创建的
LZW压缩算法的基本原理:提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引替代原始文本文件数据中的相应字符,减少原始数据大小。

详细过程感觉并不好记,使用时随时翻阅资料吧
预测编码
基于图像数据的空间或时间冗余特性,用相邻的已知像素(或像素块)预测当前像素(或像素块)的取值,然后再对预测误差进行量化和编码,包括脉冲编码调制(PCM)、差分脉冲编码调制(DPCM)等。
DM 编码
精髓是用变换来保存序列。
做法是用上行和下行两种信号模拟一个连续信号,把连续信号转换成离散。
需要用过采样,即以比奈奎斯特速率高几倍的速率对模拟信号采样。
DM 是 DPCM 的最简单形式。

DPCM 编码
精髓也是用变化代替绝对值。
这个变化是用某个像素的一边(下例是 左,左上,上三个方向)来预测这个像素。然后用预测值与本像素相减,得到误差。
这个误差会经过量化,这一步引入了误差,也达到了压缩的目的。

变换编码
将空域上的图像变换到另一变换域上,变换后图像的大部分能量只集中到少数几个变换系数上,采用适当的量化和熵编码就可以有效地压缩图像。
典型的准最佳变换有DCT(离散余弦变换)、DFT(离散傅里叶变换)、WHT(Walsh Hadama变换)、HrT(Haar变换)等。
K-L 变换
K-L 变换又称 Hotelling 变换,特征向量变换或主分量方法(这个就是主成分分析法吧。。)
步骤1:读取图片,将图片信息以8x8图像方块合成一个向量,将整张图片分割成一个n*64的矩阵A。
步骤2:计算向量数据矩阵A的协方差矩阵(64x64)。
步骤3:对协方差矩阵进行特征分解,并按特征值大小排列特征向量D。
步骤4:计算AD,得到kl变换矩阵K。
步骤5:将矩阵K的后m列置为0。
步骤6:通过K*D^T得新矩阵A,并将其重新还原图像。

DCT 变换
发送者首先将输入图像分解为8×8或16×16的块,然后再对每个图像块进行二维DCT,接着对DCT系数进行量化、编码和传输。
接收者通过对量化的DCT系数进行解码,并对每个图像块进行二维DCT逆变换。
最后将操作完成后所有的块拼接起来构成一幅单一的图像。
对于一般的图像而言,大多数DCT系数值都接近0,所以去掉这些系数不会对重建图像的质量产生较大的影响。因此,利用DCT进行图像压缩确实可以节约大量的存储空间。
DCT:
iDCT:

混合编码
混合编码是综合了熵编码、变换编码或预测编码的编码方法,如JPEG标准和MPEG标准。
JPEG
先把整个图像分解成多个8×8的图像块
8×8的图像块经过DCT后,低频分量都集中在左上角,高频分量则分布在右下角。
使用量化操作去掉高频分量,量化操作就是将某一个值除以量化表中的对应值。

采用之字型(zig-zag)顺序进行行程编码(对每一个 8x8 的块进行一次zig-zag)

得到DC码字和AC行程码字后,为了进一步提高压缩比,再进行熵编码,可采用哈夫曼编码。
Reference
[1] https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch
[2] https://rosettacode.org/wiki/LZW_compression
[3] https://www.geeksforgeeks.org/lzw-lempel-ziv-welch-compression-technique/
[4] https://www.bilibili.com/video/BV1rp4y117WB
[5] https://www.bilibili.com/video/BV15p4y1C71G
[6] https://en.wikipedia.org/wiki/Delta_modulation
[7] https://en.wikipedia.org/wiki/Differential_pulse-code_modulation
[8] https://blog.csdn.net/gmynebula/article/details/134887145
最后更新于
这有帮助吗?

