为什么图片视频不直接使用类似 huffman 这种熵编码压缩呢?

2022-06-01 13:31:28 +08:00
 nthhdy

假如不考虑图片视频利用人类视觉特点的有损压缩,只讨论无损压缩。

熵编码实现压缩,是利用了数据流里“重复出现的部分”,把这些重复部分代换成更短且能一对一无歧义还原的片段,就实现了压缩。

那么图片、视频中其实也有“重复的部分“。比如,视频压缩中利用相邻帧之间变化很小这一特点,那是不是可以说,相邻帧之间“重复的部分”非常多呢?(虽然不是完全重复,至少可以说很类似。)既然重复的部分很多,是不是可以用更 smart 的熵编码算法来直接压缩呢?

5805 次点击
所在节点    程序员
68 条回复
ipwx
2022-06-01 13:34:06 +08:00
1. 什么叫图片视频。。。
2. 现代视频编码确实是这么搞的。有兴趣可以看 h264, h265
learningman
2022-06-01 13:34:47 +08:00
肯定是啊,h264/h265/vp9 不都是吗
learningman
2022-06-01 13:35:30 +08:00
你算算按 bmp 那种方式,一个 10 分钟的 1080p 视频该多大
ruixue
2022-06-01 13:36:31 +08:00
知乎有句名言:先问是不是再问为什么
fashioncj
2022-06-01 13:40:30 +08:00
你有没有发现,大部分视频图片格式你压缩后大小几乎没有变化🤓
icyalala
2022-06-01 13:41:42 +08:00
现在的 HEVC 就是 CABAC 熵编码,也有帧内预测帧间预测
lingxi27
2022-06-01 13:42:38 +08:00
“思而不学则殆”
nothingistrue
2022-06-01 13:44:30 +08:00
你说得这个方法,正是 h264 、h265 的基本原理。也许可能不叫做熵编码算法。

还有你的第一句话,我还是第一次听说利用人类视觉特点的压缩。
newmlp
2022-06-01 13:52:57 +08:00
小伙子很有想法,vp10 h266 av2 编码标准就交给你了
litec
2022-06-01 13:56:46 +08:00
@nothingistrue 事實上影像壓縮在 DCT 後做 quantize 時,就是考慮人眼對於高頻較不敏感,所以用較少 bit 表達做壓縮。多數影像壓縮標準也都會考量真人的感受做為評比
xtreme1
2022-06-01 13:59:33 +08:00
由于你能问出这种问题, 直接看楼上们提示的 h264 你可能很难看懂(没有恶意).
建议先从 MPEG2 开始入手, 现代编码器的基础概念都是有的.
tusj
2022-06-01 14:22:44 +08:00
是不是刚听老师新讲了一个新章节,就突然灵机一动。。。
iamzuoxinyu
2022-06-01 14:51:18 +08:00
> 我还是第一次听说利用人类视觉特点的压缩。
事实上通常视频使用 YUV420 而不是 RGB444 就是 [利用人类视觉特点] 的压缩手段。
nthhdy
2022-06-01 14:52:35 +08:00
@ipwx 图片视频指的就是图片和视频

@learningman
@lingxi27
@nothingistrue

h264 以及其它的视频编码的确用了熵编码,但那只是其中的一个步骤。

可能我没有说清楚,我想说的是,为什么不能只用熵编码这一个步骤。
比如我想压缩文本,一个简单的方法是,先统计字出现的频率,用 huffman 生成编码表,然后到原文中代换,出来的结果大小接近理论压缩极限。gzip 这种工具用的方法更 smart ,但是肯定不像视频那样,需要 motion estimation 等步骤。
iamzuoxinyu
2022-06-01 14:53:30 +08:00
因为只用帧内压缩远远不够啊…
nthhdy
2022-06-01 14:55:37 +08:00
@nothingistrue
@litec

还有一个利用人类视觉效果的例子,就是颜色用 YUV 来表示,而不用 RGB 。对人眼差别不大,但大小或许会骤减。
nthhdy
2022-06-01 14:56:47 +08:00
@iamzuoxinyu 帧内压缩相当于单张图片压缩,单张图片压缩也比单纯的熵编码压缩复杂很多。
nthhdy
2022-06-01 15:01:06 +08:00
@xtreme1 感谢这个建议,这个路子非常中肯
imn1
2022-06-01 15:12:39 +08:00
你语言组织不好,把一个高阶问题问成了低阶

高阶的部分我也答不上
只知道现在的算法好像也有用到相邻帧之间的类似部分,key frame 好像就是为了这个设计的?定时修正 raw ,避免太多的帧压缩导致靠后的失真越来越严重
一知半解,不对的话可以 pass
ipwx
2022-06-01 15:13:43 +08:00
@nthhdy 信息熵是个数学概念,在实际数据集上几乎无法计算。

任何计算“熵”、“概率”,都要先假设数据服从某些分布,然后才能进行计算。各种不同的压缩方法,显然是假设数据服从不同的分布,然后用这种假设去搞了具体的编码方案。

你在教材上看到的 Huffman 编码,是假设 alphabetic 是定长的(比如 a~z ),并且每个 alphabetic 都用定长的 0-1 串编码。在这个前提下给出的最佳编码方案是霍夫曼树。但是呢。。。

显然现实世界不是这样的。你完全可以用不定长的 alphabetic 去做不定长串的压缩。这就是各路通用压缩算法大显神通的地方了。然而即便如此,通用压缩算法处理 .avi 也达不到很高的压缩比。

各种视频和图片编码显然是做了更激进的概率建模,在这种特殊的概率分布上用了更高压缩比的方案。比如视频的帧间编码,显然是利用了你“视频的帧与帧之间的信息有很多重复”这个额外信息。在通用压缩方法里面可没有这个额外信息。

----

信息论有一条,“数据的信息量 = 编码后的信息量 + 编码器的信息量”。虽然和上面的论述其实没有多大关系,但是也能提示你一点:你给程序多一点信息,你压缩以后的东西就能变得更小。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/856697

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX