今天小编分享的健康经验:你大爷永远是你大爷!JPEG 凭什么经久不衰?,欢迎阅读。
1992 年的那个夏天,一位跟您一样的绅士在黑暗的房间里死死盯着电腦。一旁的调制解调器疯狂闪烁,竭尽全力让这张 720 × 575 像素的图片,一行一行慢加载。而这在近乎无尽的等待中,绅士几乎要疯狂了。
直到 JPEG 的出现解了燃眉之急!
1992 年,"联合影像专家组" 创建了第一个国际影像压缩标准,它能在不明显降低影像质量的基础上,把影像压缩至原始大小的 10%。
随着数码相机、掃描器、互联网的发展,JPEG 迅速成为应用最广泛的影像格式。直到 32 年后的今天,你大爷还是你大爷,没有任何其他影像格式能跟 JPEG 抗衡。
JPEG 凭什么称霸影像界 30 多年?它究竟有多巧妙?
视频版
↓↓ 看完这个视频就知道了 ↓↓
↑↑ 信我,真的超级好看 ↑↑
图文版
在互联网的古早时代,JPEG 是凭借强劲的压缩实力展露头角的。所以故事的开始,我们要从 JPEG 的压缩原理谈起。
而它的原理,可以说是妙蛙种子吃着妙脆角进了米奇妙妙屋,那叫一个妙。
在 1992 年以前,主要的影像格式都是无损格式。要把它们压小,首先要知道影像中的哪些信息可以偷偷舍弃掉。这就涉及到了两个心理视觉原理。
先讲第一个:你可以看看这三张图片,哪两张看起来区别更大?显然是这两张。这是因为人眼对亮度的变化,要比对色彩的变化敏感得多。
原因也很简单:人眼中有视锥、视杆细胞两种细胞,分别负责感受颜色和亮度。
负责感受颜色的视锥细胞大概有600~700 万个,而负责感受亮度的视杆细胞则有1 亿 2500 万个,所以人眼对亮度的变化非常敏感,但对色彩的变化就迟钝一些。
既然这样,那就压缩一些颜色信息呗 ~ 这就是 JPEG 压缩的第一步。
怎么压缩颜色呢?很简单,图片由一个个像素组成,每个像素包含红绿蓝三种元素,利用这个公式,我们可以把 RGB 模型转换成YCbCr 模型,其中 Y 表示亮度,Cb 和 Cr 分别表示蓝色和红色的色度。
转换完后,就可以把蓝色、红色色度这两张图,每四小块合并成一大块,这样就把颜色信息压成了原来的1/4——反正人眼对颜色不敏感,所以也不会有太大影响。这就是 JPEG 对第一个视觉原理的应用。
而第二个视觉原理是:人眼擅长感受低频信号,却不擅长感受高频信号。
这是什么意思呢?低频信号,是这种指像素之间变化比较平缓的线条。比如整片的天空和岩石表面。而高频信号,是指这种像素之间变化比较剧烈的线条,比如复杂纹理。
比如你可能根本没发现,这张图片的左下角还藏着一只花豹。这就是因为你的眼睛对高频信号不敏感。
所以只要把图片中的高频信号删掉一些,就可以把图片再压小一点。
但问题是,怎么区分高频和低频信号呢?这里,就涉及到 JPEG 算法的精髓了。
让我们请出小李子当一下模特:如果我们只看其中一行像素的亮度值,那它的频率变化曲线是这样的,非常复杂。
但所有复杂的事物,都可以还原为简单事物的集合。比如不管多复杂的图案,都可以用最基础的积木搭建出来。任何一条曲线,都可以还原为若干余弦波的叠加。这行像素的频率变化曲线也一样。利用这 8 条基础频率曲线,就可以把它给拼凑出来。
一行像素是一维的,但图片是二维的。那再把 8 条频率曲线竖着排一列,重叠的位置两两叠加,我们就得到了一张由64 个基函数构成的 " 基图 "。
关键就在这里,这 " 基图 " 中的这 64 个基函数,每个都相当于一块积木。任何一张图片的颜色和亮度图层,都可以用这些积木搭建出来。
比如我们可以把亮度图层中每8*8 个像素划抽成一个区块,然后用基函数去 " 量 " 这个区块,得到一个矩阵。矩阵中的每一个数字,就代表这张图需要用到多少块不同的积木。
这里的 275.5,就代表它需要用 275.5 个第一种积木,59.5 个第二种积木 ......
更妙的是,观察整个矩阵,你会发现左上角的数字远大于右下角,因为左上角的 " 积木 " 代表的是低频信号。而绝大多数图片中的主要信息,都是低频信号。而高频信号,比如你脸上的鼻孔、痘痘、皱纹,跟那张大脸比起来,只是一小部分而已。
为了进一步区分低频和高频信号,专家组还提供了一组量化矩阵。只要用处理好的亮度和色度图层分别除以量化矩阵,就能得到一大堆 0,只剩下9 个非 0 的数字。
这意味着,其实只要用 9 种基础 " 积木 ",就能把小李子搭的人模人样了。这能让我们大大减少图片的信息量。
而且量化矩阵里面的数字还可以根据需求变化。如果你想把图片压小,那最终得到的 0 越多,要用到的积木越少,但出现这种锯齿状的 "伪影" 的概率也就越大。
至于这些 0,就是人眼比较麻木的高频信息,把它们编码打包,减少冗余,JPEG 的压缩就大功告成了。
可以看出,JPEG 的巧妙,在于它充分利用了人类视觉的特点,巧妙地用算法舍弃了你注意不到的信息,实现了出色的压缩效果。
但 JPEG 之所以始终是影像界的大爷,靠的不光是技术,还有当时拉胯的算力。比如在 JPEG 诞生的时候,就有比它更会压缩的算法,叫 "卡洛南 - 洛伊变换"。但它所需要的计算量太大,远超出那个年代的计算机可实现的水平。所以排名第二的 DCT 算法才成为了最终的赢家。
而且毕竟是最早一代的影像压缩标准, 随着后续的改进,JPEG 的孙子辈们在实力上也已经超越了它。比如在 2000 年,联合影像专家组又发布了另一种新的压缩影像标准:JPEG2000。它能在保持相同影像质量的情况下,把压缩率提高 200%,甚至还支持无损压缩。
但那又怎么样呢?JPEG 的人脉太广,牢牢把持住了互联网。直到目前,与 JPEG2000 兼容的軟體、浏览器还是比较少,跟我一样老,诞生于 1992 年的 JPEG 仍然是目前最普遍认可的影像檔案格式,你大爷还是你大爷。
所以,JPEG 之所以始终是你大爷,固然有自身技术出色的原因,但也是因为它把握住了历史的进程。
最后,除了 JPEG 以外,还有另一种格式也很常见:JPG。那 JPEG 和 JPG 有什么区别?
它们最大的区别,就是 JPEG 有四个字母,而 JPG 有三个字母,别的就没有了。
没开玩笑。
在 Windows 95 之前,Windows 作業系統最多只支持三个字元的檔案扩展名,所以 JPEG 被缩写成了 JPG,中间的 E 被省略了。而这种限制在 MAC 等类 UNIX 系统中并不存在,在 Windows 95 之后的作業系統在也不存在,所以 JPG 又可以用回大名 JPEG 了。
就是这样 ~