数字图像处理-初探图像编解码

一、环境

  • 系统:win10
  • 语言:c++
  • 依赖第三方库:opencv

二、图像编解码

图像编码的目的是为了压缩图像,图像解码的目的是为了尽可能的从压缩图像中恢复原。下面介绍在图像编解码中比较重要的DCT变换和量化操作。

2.1 DCT变换

一般从图像中,取出8x8大小的像素块,使用DCT算法(opencv自带)进行DCT变换,输入的是像素矩阵,输出的是频率信息(也是8x8大小),从低频到高频按顺序拍排列。DCT过程如下GIF图:

DCT

DCT之后是频率(变化),边缘越明显的位置,高频越明显。白色点的位置表示是低频信号,表示低频信息占主要成分。(某种频率成分越高,亮度越高)

2.2 iDCT变换

反DCT变化是DCT变幻的逆过程。iDCT过程如下GIF:

idct

2.3 量化

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

ACCoef

从动图中可以看出,当频率分量超过20后,就感觉不出来太多的差距了,这意味着对于64个数据,只需要取20个就可以还原图片,仅仅在量化这一步就压缩了3倍。

当然在实际过程中不可能这么暴力,根据有关部门的研究,有几套专门的量化表,例如:

1
2
3
4
5
6
7
8
9
float msk[8][8] = { 
{16,11,10,16,24,40,51,61},
{12,12,14,19,26,58,60,55},
{14,13,16,24,40,57,69,56},
{14,17,22,29,51,87,80,62},
{18,22,37,56,68,109,103,77},
{24,35,55,64,81,104,113,92},
{49,64,78,87,103,121,120,101},
{72,92,95,98,112,100,103,99} };

DCT之后的每个频率都要除msk中对应的数字,从数值中可知,高频基本都被除没了(去掉高频,但又不是完全去掉,也可以适用于一些高频分量实在多的图片)。

三、总结

当然,编码自然不只是这些步骤,在DCT和量化中并没有压缩数据,只是做了预处理,后面的熵编码等一些步骤会真实的压缩图像大小,这里不再深入研究。

代码GItHub

-------------本文结束感谢您的阅读-------------
0%