当前位置: 首页 > news >正文

【数字视频技术介绍】| 消除冗余 之 颜色模型

公众号回复:666,领取学习资源大礼包

这是一份循序渐进的视频技术的介绍,来自 Github 仓库:

https://github.com/leandromoreira/digital_video_introduction

本文档旨在尽可能使用浅显的词语,丰富的图像和实际例子介绍数字视频概念,使这些知识能适用于各种场合。

有兴趣了解更多内容的同学可以下载仓库源码,这里只做摘录,仅供参考。

往期内容:

  1. 数字视频技术介绍 之 基本术语

消除冗余

我们认识到,不对视频进行压缩是不行的;一个单独的一小时长的视频,分辨率为 720p 和 30fps 时将需要 278GB*。仅仅使用无损数据压缩算法——如 DEFLATE(被PKZIP, Gzip, 和 PNG 使用)——也无法充分减少视频所需的带宽,我们需要找到其它压缩视频的方法。

*我们使用乘积得出这个数字 1280 x 720 x 24 x 30 x 3600 (宽,高,每像素比特数,fps 和秒数)

为此,我们可以利用视觉特性:和区分颜色相比,我们区分亮度要更加敏锐。时间上的重复:一段视频包含很多只有一点小小改变的图像。图像内的重复:每一帧也包含很多颜色相同或相似的区域。

颜色,亮度和我们的眼睛

我们的眼睛对亮度比对颜色更敏感,你可以看看下面的图片自己测试。

luminance vs color

如果你看不出左图的方块 A 和方块 B 的颜色是相同的,那么好,是我们的大脑玩了一个小把戏,这让我们更多的去注意光与暗,而不是颜色。右边这里有一个使用同样颜色的连接器,那么我们(的大脑)就能轻易分辨出事实,它们是同样的颜色。

简单解释我们的眼睛工作的原理

眼睛是一个复杂的器官,有许多部分组成,但我们最感兴趣的是视锥细胞和视杆细胞。眼睛有大约1.2亿个视杆细胞和6百万个视锥细胞。

简单来说,让我们把颜色和亮度放在眼睛的功能部位上。视杆细胞主要负责亮度,而视锥细胞负责颜色,有三种类型的视锥,每个都有不同的颜料,叫做:S-视锥(蓝色),M-视锥(绿色)和L-视锥(红色)。

既然我们的视杆细胞(亮度)比视锥细胞多很多,一个合理的推断是相比颜色,我们有更好的能力去区分黑暗和光亮。

  

eyes composition

一旦我们知道我们对亮度(图像中的亮度)更敏感,我们就可以利用它。

颜色模型

我们最开始学习的 彩色图像的原理 使用的是 RGB 模型,但也有其他模型。有一种模型将亮度(光亮)和色度(颜色)分离开,它被称为 YCbCr*

* 有很多种模型做同样的分离。

这个颜色模型使用 Y 来表示亮度,还有两种颜色通道:Cb(蓝色色度) 和 Cr(红色色度)。YCbCr 可以由 RGB 转换得来,也可以转换回 RGB。使用这个模型我们可以创建拥有完整色彩的图像,如下图。

ycbcr 例子

YCbCr 和 RGB 之间的转换

有人可能会问,在**不使用绿色(色度)**的情况下,我们如何表现出所有的色彩?

为了回答这个问题,我们将介绍从 RGB 到 YCbCr 的转换。我们将使用 ITU-R 小组*建议的标准 BT.601 中的系数。

第一步是计算亮度,我们将使用 ITU 建议的常量,并替换 RGB 值。

Y = 0.299R + 0.587G + 0.114B

一旦我们有了亮度后,我们就可以拆分颜色(蓝色色度和红色色度):

Cb = 0.564(B - Y)
Cr = 0.713(R - Y)

并且我们也可以使用 YCbCr 转换回来,甚至得到绿色。

R = Y + 1.402Cr
B = Y + 1.772Cb
G = Y - 0.344Cb - 0.714Cr

*组织和标准在数字视频领域中很常见,它们通常定义什么是标准,例如,什么是 4K?我们应该使用什么帧率?分辨率?颜色模型?

通常,显示屏(监视器,电视机,屏幕等等)仅使用 RGB 模型,并以不同的方式来组织,看看下面这些放大效果:

pixel geometry

色度子采样

一旦我们能从图像中分离出亮度和色度,我们就可以利用人类视觉系统对亮度比色度更敏感的特点,选择性地剔除信息。色度子采样是一种编码图像时,使色度分辨率低于亮度的技术。

ycbcr 子采样分辨率

我们应该减少多少色度分辨率呢?已经有一些模式定义了如何处理分辨率和合并(最终的颜色 = Y + Cb + Cr)。

这些模式称为子采样系统,并被表示为 3 部分的比率 - a:x:y,其定义了色度平面的分辨率,与亮度平面上的、分辨率为 a x 2 的小块之间的关系。

  • a 是水平采样参考 (通常是 4),

  • x 是第一行的色度样本数(相对于 a 的水平分辨率),

  • y 是第二行的色度样本数。

存在的一个例外是 4:1:0,其在每个亮度平面分辨率为 4 x 4 的块内提供一个色度样本。

现代编解码器中使用的常用方案是:4:4:4 (没有子采样)**, 4:2:2, 4:1:1, 4:2:0, 4:1:0 and 3:1:1。

YCbCr 4:2:0 合并

这是使用 YCbCr 4:2:0 合并的一个图像的一块,注意我们每像素只花费 12bit。

  

YCbCr 4:2:0 合并

下图是同一张图片使用几种主要的色度子采样技术进行编码,第一行图像是最终的 YCbCr,而最后一行图像展示了色度的分辨率。这么小的损失确实是一个伟大的胜利。

色度子采样例子

前面我们计算过我们需要 278GB 去存储一个一小时长,分辨率在720p和30fps的视频文件。如果我们使用 YCbCr 4:2:0 我们能剪掉一半的大小(139GB)*,但仍然不够理想。

* 我们通过将宽、高、颜色深度和 fps 相乘得出这个值。前面我们需要 24 bit,现在我们只需要 12 bit。

自己动手:检查 YCbCr 直方图

你可以使用 ffmpeg 检查 YCbCr 直方图。这个场景有更多的蓝色贡献,由直方图显示。

  

ycbcr 颜色直方图

推荐阅读:

数字视频技术介绍 之 基本术语

移动端技术交流喊你入群啦~~~

推荐几个堪称教科书级别的 Android 音视频入门项目

一文读懂 YUV 的采样与格式

UC浏览器视频播放缓存以及视频下载分析

觉得不错,点个在看呗~

相关文章:

  • libyuv的编译与使用
  • 没想到,快手成了“生产力”
  • Unity手游实战:从0开始SLG——客户端技术选型
  • 【数字视频技术介绍】| 视频帧类型(I 帧、P 帧、B 帧)
  • 【数字视频技术介绍】| 编码中的时间冗余和空间冗余
  • 错误终结者:Fragment在ViewPager中的正确应用
  • 如何理解图片采样,这应该算是基础知识吧?
  • Android OpenGL ES 实现 3D 阿凡达效果
  • 音视频开发入门必备之基础知识
  • 6/6 音视频技术大咖在线直播,教你开发者硬核个人成长指南
  • 关于多线程,你必须知道的那些玩意儿
  • Android Camera2 实现高帧率预览录制(附源码)
  • 自定义相机中如何实现二维码扫描功能
  • 渐变过渡的相册(shader)
  • 【C++11新特性】 C++11 智能指针之shared_ptr
  • 【前端学习】-粗谈选择器
  • Apache的基本使用
  • oschina
  • React-flux杂记
  • text-decoration与color属性
  • vue2.0项目引入element-ui
  • Wamp集成环境 添加PHP的新版本
  • webpack4 一点通
  • 对象引论
  • 深度学习中的信息论知识详解
  • 通过几道题目学习二叉搜索树
  • 智能合约Solidity教程-事件和日志(一)
  • 智能网联汽车信息安全
  • 自定义函数
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (c语言)strcpy函数用法
  • (C语言)共用体union的用法举例
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (一) storm的集群安装与配置
  • (转)ObjectiveC 深浅拷贝学习
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)Linux 多线程条件变量同步
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • ***利用Ms05002溢出找“肉鸡
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET : 在VS2008中计算代码度量值
  • .NET 服务 ServiceController
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @EnableWebMvc介绍和使用详细demo
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [1159]adb判断手机屏幕状态并点亮屏幕