What?不知道什么是熵?那我们还是先看看熵的概念吧。
首先,熵的概念很早就有,在物理学,热力学中早有应用。
后来信息论中,Shannon他老人家发明了信息熵。
公式如下,它代表了信源S的熵:
单位:Bit/字符
那信息熵到底是什么呢?它是信息量的度量单位。不要再去想什么不确定性了,抽象的让人想去抽它,就认为它是信息的多样性吧,它的实际意义有两个:
1. 信源S的平均信息量
2. 编码所有符号S平均所需要的位数
好了,无论你有没有看懂,我都要开始讲熵编码了。
为什么要编码? 编码的一个重要目的是压缩 (当然还有其他目的,比如加密)。举个例子就是把100MB的原始数据,压缩成10MB的数据,这个过程就需要编码。
那么怎么编码才能不失真呢?就是说解码后可以完全恢复原始数据。用信息熵来计算数据压缩的理论极限呀!
那什么是熵编码?在信息熵的极限范围内进行编码就是熵编码。例如信息熵算出来是3bit/字符,你用4bit/字符来编码,就是熵编码,你用2bit/字符来编码,就不叫熵编码,因为这种情况下,就失真了嘛。
从这里也看以看出,信源熵是编码这个信源平均所需要的最小位数。
所以,熵编码是无损压缩。
熵编码有很多种:
霍夫曼编码 (Huffman)
算术编码
行程编码 (RLE)
基于上下文的自适应变长编码(CAVLC)
基于上下文的自适应二进制算术编码(CABAC)
熵编码一个很重要的应用领域就是图像压缩。
下面是JPEG的编码流程。蓝色框中的编码就是用了熵编码。
至于其他的视频标准,如MPEG2,H264, H265,编码流程都是大同小异,过程无非都是采样-DCT-量化-编码。
它们都会用到熵编码,例如JPEG用的是Huffman编码和算术编码,H264用的是CAVLC和CABAC。
为什么要有这么多的编码标准呢?又是Huffman,又是CABAC,又是有损,又是无损,无非是斤斤计较的人类在寻求一种最优化的权衡罢了,既想拥有令人惊叹的压缩比,又不想失真,同时也想降低算法复杂度,让电脑在编码的时候可以快点再快点,编码后数据量小点再小点,最好还能再清楚点。
我也是晕了,这么多算法搞得眼花缭乱,不过别担心,小伙伴们,因为在工作中,你不用去自己写算法,它们多半是靠硬件来实现滴,比如有硬件熵编码器模块,你直接拿来就可以用了。 假如很不幸的,你要用软件来实现编码,也没关系,现成的代码模块,网上一堆一堆的。
所以,同学们,不用发愁你学不会这个复杂的算法,现实生活中,也很少会让你去计算什么信息熵,因为前辈们早已铺好道路了,你只需站在他们的肩膀上前行就好了。
但是!!做理论研究的同学,还是得好好学习,天天向上,因为你们需要为人类无止尽的优化事业添砖加瓦。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!