JPEG的DCT压缩原理,谁能通俗易懂解释一下?
看了这篇博文http://blog.csdn.net/jubincn/article/details/6882179,对JPEG的压缩原理还是有点模糊:
1.JPEG经过离散余弦处理后为什么就能压缩图片大小?
2.JPEG图片到底存储的是什么,压缩后减少的是什么?
3.对每个像素点进行离散余弦变换,是每个像素点的R、G、B值分别进行吗?
上面问题虽然很菜,还是希望大大们不吝赐教,感激不尽。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
1
首先人眼对低频敏感对高频不敏感,而维基百科里说了
所以可以省去离散余弦变换后矩阵里的高频部分来对图像进行压缩,这是JPEG的主要原理。
那么什么是高频部分?对于一个矩阵
对其离散余弦变换后并舍位取最接近的整数,得
可以看到矩阵每个元素的绝对值是从左上角到右下角越来越小的,其中左上角称为DC系数,是整个矩阵的平均值。其余的称为AC系数。越靠近右下角,其对应的频率越高。那么根据人眼对低频敏感对高频敏感这个原理,省掉右下部分的一些值的话,对人眼来说,看起来实际上是没什么区别的。
2
对一个图像的矩阵DCT之后,需要对它进行量化。这方面我不是很熟悉。
From wiki
对1中的结果进行量化的结果如图
接下来对这个矩阵使用熵编码,最后存的就是熵编码再二进制编码(总不可能直接以文本的形式存储熵编码吧)之后的东西。
回答1里说了,压缩减少的是高频区域上的信息量。
3
不可能对一个像素点进行离散余弦变换的,没有意义。你的原文里也说了,是将矩阵分为8x8的块,分别进行DCT、量化、熵编码。
对于第二个问题,简单的回答是是。但是维基百科说
然后在DCT过程中对每个成分(Y,U,V)分别使用离散余弦变换和余下的步骤。
时间仓促,错误之处请不吝指正。
1,首先说一下存储的是什么,这个问题解决后自然就可以明白为何文件变小,也就是压缩。
简单说jpeg存储的是DCT后模矩阵的系数。那模矩阵又是什么呢,看图
如果显示出所对应的色块的话,是这样的!
借助2楼的矩阵我们来看一下,第三个矩阵既是系数矩阵,也就是jpeg存储的,为什么右下角大部分都是零?因为模矩阵右下角是高频嘛,画成函数图像就是超级密集的cos波形,最右下角达到了7pi/16,不是说这么细小的地方我们把它忽视,而是JPEG在yuv采样的时候也达不到如此精细。
2,知道存储的是系数我们回到第一个问题,为啥就压缩了呢,为了便于理解咱们先把霍夫曼算法放一边,简单说一下压缩这个概念,以游程编码为例,10000010001001000100这么一串数如果写成,51 150的话是不省地方,解码器一看,啊就是TM5个1,15个0啊,当然真正游程编码还要分段这里就打个比方。霍夫曼编码又有自己的思想,查一下就知,但是那个树状图也是1,0构成。
3,这里纠正下楼主,一般jpeg是把图像分块,每个区是8*8,越保真的分的块越多,当然文件大小也变大,保真和大小是鱼和熊掌不可兼得。所以是以矩阵的形式做dct至于图层是以RGB还是YUV,发明者说他们是以YUV做的。最后附上发明者解说视频https://www.youtube.com/watch?v=Q2aEzeMDHMA
1.DCT变换只是将空间域的像素点转换成频率域而已,压缩是靠哈弗曼压缩技术。
这里就要说一下信号与系统,当一些信号在当前信号域下不好处理的时候,可以转换到别的域处理。像素点所在的是空间域,如果通过离散余弦变换(DCT)之后,转换到频率域。在这个信号域下处理更方便。类似的变换方式还有 离散傅里叶变换,小波变换等。这些个变换在去噪、滤波方面用的多。
而压缩图片大小的根本方式是哈弗曼编码,如果你知道这个编码就好办,如果不知道我就简单说一下。这个事可证明的,效率最高的压缩方式。对单个字符按照频率编码长度,比如使用频率最高的字符a就可以直接编写为2进制01两位,频率最低的x可能编码超过一个字节,比如0001010101总共10位二进制位。但是这样的总码长是最短的。通过这样的方式给每个DCT系数编码,这样处理来压缩数据大小。
2.存储的是DCT系数表,不过这个DCT系数表是用Huffman编码之后存储的。Huffman编码分为两部分,一个是编码表,另外的一个是编码数据。当然JPEG图片不可能只存储这些东西,其他的内容,你可以看一下jpeg图像格式,知道具体分为哪些部分,就明白了。
3.对的。是分别进行的。
我也是一知半解,希望我的回答能够解答你最基础的疑惑。