计算机速成课Crash Course - 21. 压缩

更多技术文章,全网首发公众号 “摸鱼IT” 锁定 -上午11点 - ,感谢大家关注、转发、点赞!

计算机速成课Crash Course - 21. 压缩 (qq.com)

今天继续计算机速成课Crash Course的系列讲解。

21. 压缩

上集我们讨论了文件格式,如何编码文字,声音,图片,还举了具体例子 .txt .wav .bmp。

这些格式虽然管用,而且现在还在用,但它们的简单性意味着效率不高。我们希望文件能小一点,这样能存大量文件,传输也会快一些。

图片

解决方法是压缩,把数据占用的空间压得更小,用更少的位(bit)来表示数据。

听起来像魔法,但其实是计算机科学!

我们继续用上集的 吃豆人例子,图像是4像素x4像素,之前说过,图像一般存成一长串像素值。

为了知道一行在哪里结束,图像要有元数据,写明尺寸等属性,但为了简单起见,今天忽略这些细节。

图片

如果红绿蓝都是255会得到白色,如果混合255红色和255绿色,会得到黄色。这个图像有16个像素(4x4),每个像素3个字节,总共占48个字节(16x3=48),但我们可以压缩到少于 48 个字节。

一种方法是 减少重复信息。最简单的方法叫 游程编码(Run-Length Encoding),适合经常出现相同值的文件。

比如吃豆人 有7个连续黄色像素,与其全存下来:黄色,黄色,黄色...,可以插入一个额外字节,代表有7个连续黄色像素,然后删掉后面的重复数据。

图片

为了让计算机能分辨哪些字节是"长度" 哪些字节是"颜色",格式要一致,所以我们要给所有像素前面标上长度,有时候数据反而会变多,但就这个例子而言,我们大大减少了字节数,之前是48 现在是24。

图片

小了50%!省了很多空间!

还有,我们没有损失任何数据,我们可以轻易恢复到原来的数据,这叫"无损压缩",没有丢失任何数据,解压缩后,数据和压缩前完全一样。

我们来看另一种无损压缩,它用更紧凑的方式表示数据块,有点像 "别忘了变厉害"(don't forget to be awesome) 简写成 DFTBA.

为此,我们需要一个字典,存储"代码"和"数据"间的对应关系。我们看个例子:

我们可以把图像看成一块块,而不是一个个像素,为了简单,我们把2个像素当成1块(占6个字节),但你也可以定成其他大小。

我们只有四对:白黄、黑黄、黄黄、白白,我们会为这四对,生成紧凑代码(compact codes),有趣的是,这些块的出现频率不同。

图片

1950年代 大卫·霍夫曼 发明了一种高效编码方式,叫"霍夫曼树"(Huffman Tree) 当时他是麻省理工学院的学生,算法是这样的:

图片

首先,列出所有块和出现频率,每轮选两个最低的频率,这里 黑黄 和 白白 的频率最低,它们都是 1,可以把它们组成一个树,总频率 2,现在完成了一轮算法。

图片

现在我们重复这样做,这次有3个可选,就像上次一样,选频率最低的两个,放在一起,并记录总频率,好,我们快完成了。

这次很简单,因为只有2个选择,把它们组合成一棵树就完成了!

图片

现在看起来像这样,它有一个很酷的属性:按频率排列,频率低的在下面。

现在有了一棵树,你可能在想 "怎么把树变成字典?"我们可以把每个分支用 0 和 1 标注,就像这样,现在可以生成字典。

黄黄 编码成 0,白黄 编码成 10,黑黄 编码成 110,白白 编码成 111。

图片

酷的地方是它们绝对不会冲突,因为树的每条路径是唯一的。意味着代码是"无前缀"的,没有代码是以另一个代码开头的。

图片

现在我们来压缩!

注意是位(bit)!不是字节(byte)!14位(bit) 还不到2个字节(byte)!

字典也要保存下来,否则 14 bit 毫无意义,所以我们把字典 加到 14 bit 前面,就像这样,现在加上字典,图像是 30 个字节(bytes),比 48 字节好很多。

图片

"消除冗余"和"用更紧凑的表示方法",这两种方法通常会组合使用,几乎所有无损压缩格式都用了它们,比如 GIF, PNG, PDF, ZIP。

游程编码 和 字典编码 都是无损压缩,压缩时不会丢失信息,解压后,数据和之前完全一样,无损对很多文件很重要,比如我给你发了个压缩的 word 文档,你解压之后发现内容变了,这就很糟糕了。

但其他一些文件,丢掉一些数据没什么关系,丢掉那些人类看不出区别的数据,大多数有损压缩技术,都用到了这点,实际细节比较复杂,所以我们讲概念就好。

以声音为例,你的听力不是完美的,有些频率我们很擅长,其他一些我们根本听不见,比如超声波,除非你是蝙蝠。

举个例子,如果录音乐,超声波数据都可以扔掉,因为人类听不到超声波,另一方面,人类对人声很敏感,所以应该尽可能保持原样,低音介于两者之间,人类听得到,但不怎么敏感,一般是感觉到震动。

图片

有损音频压缩利用这一点,用不同精度编码不同频段,听不出什么区别,不会明显影响体验,音乐发烧友估计要吐槽了!

日常生活中你会经常碰到这类音频压缩,所以你在电话里的声音和现实中不一样,压缩音频是为了让更多人能同时打电话。

图片

如果网速变慢了,压缩算法会删更多数据,进一步降低声音质量,所以 Skype 通话有时听起来像机器人,和没压缩的音频格式相比,比如 WAV 或 FLAC( 这下音乐发烧友满意了),压缩音频文件如 MP3,能小10倍甚至更多。省了超多空间!

这种删掉人类无法感知的数据的方法,叫"感知编码",它依赖于人类的感知模型,模型来自"心理物理学"领域。

这是各种"有损压缩图像格式"的基础,最著名的是 JPEG,就像听力一样,人的视觉系统也不是完美的。

我们善于看到尖锐对比,比如物体的边缘,但我们看不出颜色的细微变化,JPEG 利用了这一点,把图像分解成 8x8 像素块,然后删掉大量高频率空间数据。

举个例子,这是导演的狗,超可爱!

图片

我们来看其中一个 8x8 像素,几乎每个像素都和相邻像素不同,用无损技术很难压缩,因为太多不同点了,很多小细节,但人眼看不出这些细节,因此可以删掉很多,用这样一个简单的块来代替,这看起来一样,但可能只占10%的原始数据。

图片

我们可以对所有 8x8 块做一样的操作,图片依然可以认出是一只狗,只是更粗糙一些。

图片

以上例子比较极端,进行了高度压缩,只有原始大小的八分之一。通常你可以取得平衡,图片看起来差不多,但文件小不少。

你看得出两张图的区别吗?

图片

估计看不出,但我想提一下,视频压缩也造成了影响,视频只是一长串连续图片,所以图片的很多方面也适用于视频,但视频可以做一些小技巧,因为帧和帧之间很多像素一样,比如我后面的背景!这叫 时间冗余。

图片

视频里不用每一帧都存这些像素,可以只存变了的部分,当帧和帧之间有小小的差异时,比如后面这个频率发生器,很多视频编码格式,只存变化的部分,这比存所有像素更有效率,利用了帧和帧之间的相似性,更高级的视频压缩格式会更进一步,找出帧和帧之间相似的补丁,然后用简单效果实现,比如移动和旋转,变亮和变暗。

如果我这样摆手,视频压缩器会识别到相似性,用一个或多个补丁代表我的手,然后帧之间直接移动这些补丁,所以你看到的是我过去的手(不是实时的),有点可怕,但数据量少得多。

MPEG-4 是常见标准,可以比原文件小20倍到200倍,但用补丁的移动和旋转来更新画面,当压缩太严重时会出错,没有足够空间更新补丁内的像素,即使补丁是错的,视频播放器也会照样播放,导致一些怪异又搞笑的结果,你肯定见过这些。

图片

总的来说,压缩对大部分文件类型都有用,从这个角度来讲,人类不完美的视觉和听觉也算有用,学习压缩非常重要,因为可以高效存储图片,音乐,视频。

如果没有压缩,在 YouTube 看"明星拼车唱歌"几乎不可能,因为你的带宽可能不够(会很卡),而且供应商不愿意免费传输那么多数据,现在你知道为什么打 Skype 电话,有时像在和恶魔通话。


以上内容就是 21.压缩 的内容,感兴趣的同学记得点赞、关注、转发、收藏哦!

我会不定期发布课程的讲解!

更多技术文章,全网首发公众号 “摸鱼IT” 锁定 -上午11点 - ,感谢大家关注、转发、点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IN操作符

目录 IN NOT IN Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 IN IN 指的是根据一个指定的范围进行数据查询 1.查询出员工编号是 7369、7566、7788、9999 的员工信息 利用前面学的知识,得出: SQL> set linesize 250 SQL>…

Docker(十一)Swarm mode

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! Swarm mode Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎,成为了 docker 子命令 docker swarm。请注意与旧的 Docker Swarm …

力扣509. 斐波那契数

动态规划 思路: 斐波那契数通式:F(n) F(n - 1) F(n - 2);以此为状态转移方程,对其进行动态规划;边界条件: F(0) 0F(1) 1使用两个变量来存储上一组结果; class Solution { public:int fib(…

Docker安装配置OnlyOffice

OnlyOffice 是一款强大的办公套件,你可以通过 Docker 轻松安装和部署它。本文将指导你完成安装过程。 步骤 1:拉取 OnlyOffice Docker 镜像 首先,使用以下命令从 Docker Hub 拉取 OnlyOffice Document Server 镜像: sudo docke…

计算机毕业设计 基于MVC的自习室管理和预约系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

如何用数据赋能社媒营销决策?

在数字化时代,越来越多的商家开始意识到数据分析对于改善经营的重要性。 传统决策更多依赖过往经验、商业直觉、他人的思路模板等方法,或者依靠描述性统计、简单的数据分析。在数字时代,则通过精细化数据分析,做出更明智的营销决策…

LLM包含的知识

基础知识 磨刀不误砍柴工,LLM基础知识还是需要的。会按照历史梳理LM,详解BERT、GPT系列等各种预备核心知识点,并带着进行GPT预训练实战、位置编码(长文本问题)实战等。 数据工程 数据很重要,数据是天花板…

在docker中配置 Linux ls 配色方案 与 shell 提示符

发行版中默认的配置一般非常合理,但是docker中往往忽略了这些简单的配置,备忘一下 1. ls 配色方案 vim ~/.bashrc 在文件最末尾加入如下一行内容: export LS_COLORS"rs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40…

基于供水管网建模的漏损控制

1.1供水管网模型的概念和管网建模目的 供水管网系统是比较特殊的城市基础设施,不可见且属于压力管道。随着运行年限的增长,管道的过水能力和水泵的运行工况都发生了变化,管道的改扩建也使管网系统的结构发生了变化,导致系统运行状…

WPF-HelixToolkit包的使用(上)

1、引入HelixToolkit包:新建一个WPF项目,在项目“引用”上右击,选择“管理NutGet程序包”, 2、在左侧“浏览”中输入“helixtoolkit” 3、安装第一个“HelixToolkit”包 4、解决错误:右击属性->应用程序->目标框…

Unity -简单键鼠事件和虚拟轴

简单键鼠事件 — “Test_03” KeyTest 键鼠事件每帧都要监听,要放在Update()中处理 public class KeyTest : MonoBehaviour {// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){// 【鼠标点击事件…

银河麒麟桌面桌面操作系统v10保姆级安装

目录 一、下载ISO映像文件 1.产品试用申请 2.试用版下载 二、虚拟机搭建 1.新建虚拟机 2. 选择虚拟机硬件兼容性 3.选择安装客户机操作系统 4.选择客户机操作系统 5.命名虚拟机 6.处理器配置 7.虚拟机内存 8.网络类型 9.硬件 10.指定磁盘容量 三、修改虚拟…

STM32 Hal库FreeRtos查看所有任务的内存栈信息使用情况剩余空间 仅需一个函数搞定 超简单

STM32F103 基于Hal库跑FreeRtos,查看所有任务的栈的信息,包括任务名,任务状态,任务优先级,空闲栈,任务号。 运行结果如下 只需要使用一个函数vTaskList :获得任务的统计信息,形式为…

echart3D地图使用

由于项目需求,需要实现3D全国地图,并且在3D地图上通过3D柱状图显示各个区域的数据,并鼠标悬浮该区域的时候,需要实现该省份区域模块整体向上移动的特效 实现效果大致如下,细节需要各位同学自行调整了 需要安装echart…

03--数据库连接池

1、数据库连接池 1.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet、beans)中建立数据库连接进行sql操作断开数据库连接 这种模式开发,存在的问题:…

Flink Kubernetes Operator 介绍

一、简介 Flink Kubernetes Operator是针对在Kubernetes上运行Apache Flink应用程序而设计的工具。它充分利用了Kubernetes的优势,实现了对Flink集群的弹性管理和自动化操作,通过扩展Kubernetes API的方式,提供了管理和操作Flink部署的功能。…

【Qt】—— Qt的基本介绍

目录 (一)什么是Qt (二) Qt的发展史 (三)Qt⽀持的平台 (四) Qt版本 (五)Qt的优点 (六)Qt的应⽤场景 (七&#xff09…

5G_射频测试_测试模式解读(三)

Downlink test models FR1 test model 1.1 (NR-FR1-TM1.1)(满PRB,QPSK)FR1 test model 1.2 (NR-FR1-TM1.2)( QPSK/boosted/40% QPSK)FR1 test model 2 (NR-FR1-TM2)(64QAM 只有1个PRB 功率最低)FR1 test model 2a (NR-FR1-TM2a) )(256QAM 只…

一文了解SSL证书价格

SSL证书的价格因供应商、证书类型和服务级别而异。以下是一些一般性的价格范围: 1. 免费证书:一些证书颁发机构(CA)提供免费的SSL证书,最著名的是JoySSL。这种证书通常适用于个人网站和小型业务。免费证书提供了基本的…

redis优化系列(六)

本期分享redis内存过期策略:过期key的处理 Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。 可以通过修改配置文件来设置Redis的最大内存: maxmemory 1gb …