一、环境
- 系统:win10
- 语言:c++
- 依赖第三方库:opencv
二、图像编解码
图像编码的目的是为了压缩图像,图像解码的目的是为了尽可能的从压缩图像中恢复原。下面介绍在图像编解码中比较重要的DCT变换和量化操作。
2.1 DCT变换
一般从图像中,取出8x8大小的像素块,使用DCT算法(opencv自带)进行DCT变换,输入的是像素矩阵,输出的是频率信息(也是8x8大小),从低频到高频按顺序拍排列。DCT过程如下GIF图:

DCT之后是频率(变化),边缘越明显的位置,高频越明显。白色点的位置表示是低频信号,表示低频信息占主要成分。(某种频率成分越高,亮度越高)
2.2 iDCT变换
反DCT变化是DCT变幻的逆过程。iDCT过程如下GIF:

2.3 量化
为什么需要量化,这是由于人眼对图像中的高频信息不敏感,下面给出一个GIF动图说明,该动图逐步使用1~64级频率分量进行反DCT变换得到:

从动图中可以看出,当频率分量超过20后,就感觉不出来太多的差距了,这意味着对于64个数据,只需要取20个就可以还原图片,仅仅在量化这一步就压缩了3倍。
当然在实际过程中不可能这么暴力,根据有关部门的研究,有几套专门的量化表,例如:
1 | float msk[8][8] = { |
DCT之后的每个频率都要除msk中对应的数字,从数值中可知,高频基本都被除没了(去掉高频,但又不是完全去掉,也可以适用于一些高频分量实在多的图片)。
三、总结
当然,编码自然不只是这些步骤,在DCT和量化中并没有压缩数据,只是做了预处理,后面的熵编码等一些步骤会真实的压缩图像大小,这里不再深入研究。