cnblogs 网站将文本J:a:b渲染成了J️b。是否可通过设置博客后台解决此问题?有知道的同学请留言指点一下,谢谢。

FFmpeg 中的色彩与像素系列文章如下:

[1]. FFmpeg中的色彩空间与像素格式1-色彩空间基础

[2]. FFmpeg中的色彩空间与像素格式2-RGB/YUV色彩空间

[3]. FFmpeg中的色彩空间与像素格式3-像素格式

2. RGB/YUV 色彩空间

2.1 RGB 色彩空间

太深的原理已超出本文的讨论范围和研究目的。这里摘录一些经验观点:

RGB 三原色不是唯一的正交基,还可以有其他选择,只不过 RGB 能组合出来的颜色更为丰富。[8]

不考虑人类视觉的特殊性时,我们平时所认为的“红+绿=黄”之类的“颜色叠加”是不成立的。因为红色和绿色的单色光的混合只有在人类的视觉中才会跟黄色的单色光一样,它们在其它动物的视觉中不一定是一样的。也就是说,不考虑人类视觉的特殊性时,不存在 RGB 颜色空间。[8]

人类有三种视锥细胞用于感知颜色,这三种视锥细胞对红(R)、绿(G)、蓝(B)三种颜色敏感。[9]

人眼看到的物体颜色,是光源照射到物体,物体吸收(还有透射)部分颜色的光,然后从物体表面反射的光线进入人眼后人眼得到的色彩感觉。

人眼看到物体为黑色,是因为没有光线从物体表面反射进入人眼。一种情况是物体将光线完全吸收,没有光从物体表面反射出来(例如白天我们看一件黑衣服);另外一种情况是没有任何光线照射到物体(例如黑夜我们看一张白纸)。

人眼看到物体为白色,是因为在白光源照射下,物体不吸收光线而将光线全部反射(例如白天我们看一张白纸)。

颜色与光源和物体的吸色特性密切相关,基于此,引出混色方法中的加色法和减色法。

加色法利用光源发射特性,将各分色的光谱成分相加得到混合颜色。RGB 色彩空间采用加色法。当无任何光线照射时,R、G、B 三种颜色分量都为 0 时,物体呈现黑色;当 R、G、B 三种颜色分量达到最大时,物体不吸收光线只反射的情况下,物体呈现白色。我们称黑色为最暗,白色为最亮,要达到最亮状态,需要三色分量最大程度混合,因此称为加色。

[11]

加色法用于自发光物体。RGB 颜色空间主要应用于计算机显示器、电视机、舞台灯光等,都具有发光特性。彩色像素在显示器屏幕上不会重叠,但足够的距离时,光线从像素扩散到视网膜上会重叠,人眼会感觉到重叠后的颜色效果。

减色法是利用颜料吸色特性,每加一种颜色的颜料,会吸收掉对应的补色成分。CMYK 色彩空间采用减色法。例如,我们在白纸(白光照射、不吸收、全反射)上涂颜料,黄色颜料能吸收蓝色(黄色的补色),因此在白光照射下显示黄色,当黄(Y)、青(C)、品红(M)三色混在一起且颜色分量都为最大时,它们的补色成分被吸收掉,变成了黑色;当三色分量为 0 即什么也不涂时,白纸显现白色。要达到最大亮度,需要三色分量完全消失,因此称为减色。

印刷时,无法达到理想程度,C、M、Y 最大程度混合后无法得到纯黑色,只能得到深灰色,因此在 C、M、Y 三色之外引入了 K(黑色)。

[12]

减色法用于无法发光的物体。CMYK 颜色空间主要应用于印刷、绘画、布料染色等。

RGB 色彩空间中每个像素点包含了 R、G、B 三种分量。RGB 存储模式也有 packed 和 planar 两类,这两种模式的区分在第 3 节中讲述。RGB 色彩空间及存储模式比较简单,我们挑几个有代表性的存储模式来简述一下:

2.1.1 存储模式 RGB565

使用 16b(bit)表示一个像素,5b 用于 R,6b 用于 G,5b 用于 B。如下:

[ R G B ]  [ R G B ]  [ R G B ]  [ R G B ]
[ R G B ] [ R G B ] [ R G B ] [ R G B ]

以上只是示意图,实际 R、G、B 顺序可能与图中不同。

2.1.2 存储模式 RGB888

使用 24 位来表示一个像素,每个分量都用 8 位表示。其示意图跟 RGB565 示意图类似。

2.1.3 存储模式 ARGB8888

使用 32 位来表示一个像素,R、G、B 都用 8 位表示,另外 A(Alpha)表示透明度,也用 8 位表示。

[ A R G B ]  [ A R G B ]  [ A R G B ]  [ A R G B ]
[ A R G B ] [ A R G B ] [ A R G B ] [ A R G B ]

以上只是示意图,实际 A、R、G、B 顺序可能与图中不同。

2.2 YUV 色彩空间简介

YUV 颜色空间是 PAL、NTSC、SCEAM 三大视频标准使用的颜色空间,主要应用于视频系统。YUV 色彩空间中,Y 表示亮度信息,U 和 V 表示色度(色调和饱和度)信息。使用 YUV 色彩空间,后期出现的彩色电视系统和早期的黑白电视系统兼容,黑白电视机可以只处理彩色电信信号中的 Y 分量,而彩色电视机接收黑白电视信号显示也没有任何问题。

YUV 颜色空间和 RGB 颜色空间可以根据公式相互转换。

经常提到的还有 YPbPr 和 YCbCr。YPbPr 指模拟分量信号(或接口),P(Parallel)表示并行,b 下标表示蓝,r 下标表示红。YCbCr 指的是数字分量信号(或接口),C(Chroma)表示色度。YCbCr 还可指色彩空间,YCbCr 色彩空间是 YUV 色彩空间的缩放和偏移版本。

YUV, YCbCr, YPbPr 所指涉的范围,常有混淆或重叠的情况。从历史的演变来说,其中 YUV 和 Y'UV 通常用来编码电视的模拟信号,而 YCbCr 则是用来描述数字的视频信号,适合影片与图片压缩以及传输,例如 MPEG、JPEG。 但在现今,YUV 通常已经在计算机系统上广泛使用。[14]

人眼有一个特性:对亮度更敏感,对色度没有那么敏感。因此压缩色度分量可以降低数据量,但并不会人眼主观感觉造成太大影响。这是 YUV 采样的理论基础。主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。这些采样方式,不压缩 Y 分量,对 UV 分量的压缩程度不同。

2.3 YUV 采样方式命名法

本节内容整理自参考资料[2]。

为方便描述,我们将一个 Y 值称作一个亮度样本。一对 Cb+Cr 值称作一个色度样本。因为采样方式中只对色度进行下采样,不对亮度进行下采样,所以在一幅图像中,亮度样本数等于图像像素总数。

2.3.1 J️b 命名法

采样方式采用的是 J️b 命名形式。这个比例指的是在水平方向上的相对采样率,注意此形式的命名中并没有体现垂直方向的采样率。J️b 表示,一幅图像中总像素数目(奇数行+偶数行的总像素数,也等于总亮度样本数) : 奇数行中的色度样本数 : 偶数行中的色度样本数。按照惯例,J 通常都是 4。



以上图来理解,图中 a 部分,一个细线方框表示一个图像像素,一个粗线方框表示一个色度样本(即一对 Cb、Cr)。可以看到 YUV4:4:4 中,每个图像像素包含一个色度样本,而 YUV4:4:0 和 YUV4:2:2 则是每两个图像像素包含一个色度样本,YUV4:2:0 和 YUV4:1:1 是每四个图像像素包含一个色度样本,YUV4:1:0 是每八个图像像素包含一个色度样本。这幅图看起来非常直观,一眼能看出一幅图像中每多少个像素采样出一个色度样本。

图中 b 部分则详解了各种采样方式的命名含义。J️b 命名形式中,引入了图像参考块的概念,参考块是 J 个像素宽(J 实际是 4)2 个像素高的一个图像块,那么 J️b 的含义就是,J 个像素宽的参考块中,第一行中有 a 个色度样本,第二行中有 b 个色度样本。此处由参考块解释的 J️b 的含义,与前前提到的 J️b 表示图像总像素数目 : 奇数行中的色度样本数 : 偶数行中的色度样本数,实际含义是一致的。

2.3.2 h/v 命名法

其实,采样方式可以由两个简单含义的数字描述:水平和垂直采样因子。水平采样因子表示在水平方向每多少个像素采样出一个色度样本,垂直采样因子表示在垂直方向每多少个像素采样出一个色度样本。这种方式可以称作 h/v 命名形式。

J️b 的命名形式很容易让人迷惑,实际上很多文章中关于采样方式的介绍要么是错的,要么含混不清,让人无法明白 J️b 中三个数字的含义。而 h/v 的命名形式实际更容易理解。但遗憾的是,现实中广泛使用的是 J️b 命名法,而未采用 h/v 命名法。

J️b 命名中,并没有体现出垂直方向采样率相关的信息。但是我们可以列出每一种采样方式的 J️b 命名形式以及 h/v 命名形式,这样可以很方便地得到此采样方式的水平采样率和垂直采样率,这更便于理解。如下表:

J️b h/v 说明
4:4:4 1/1 水平方向,每 1 个像素采样出 1 个色度样本;垂直方向,每 1 个像素采样出 1 个色度样本
4:4:0 1/2 水平方向,每 1 个像素采样出 1 个色度样本;垂直方向,每 2 个像素采样出 1 个色度样本
4:2:2 2/1 水平方向,每 2 个像素采样出 1 个色度样本;垂直方向,每 1 个像素采样出 1 个色度样本
4:2:0 2/2 水平方向,每 2 个像素采样出 1 个色度样本;垂直方向,每 2 个像素采样出 1 个色度样本
4:1:1 4/1 水平方向,每 4 个像素采样出 1 个色度样本;垂直方向,每 1 个像素采样出 1 个色度样本
4:1:0 4/2 水平方向,每 4 个像素采样出 1 个色度样本;垂直方向,每 2 个像素采样出 1 个色度样本

2.4 YUV 采样方式中的存储模式

采样方式描述对原始图像如何进行亮度样本和色度样本的采样。而对于同一种采样方式,数据在内存中可以有不同的排布方式。图像样本数据在内存中的排布方式称作存储模式。YUV 存储模式分成三大类:

packed:将 Y、U、V 分量交织存放在一起,和 RGB 的存放方式类似。内存中排列形式类似:YVYUYVYUYVYUYVYU...。在具体的存储模式命名中,packed 格式不带后缀 P。

planar:将 Y、U、V 的三个分量分别存放在不同的矩阵(平面)中。内存中排列形式类似:YYYYYY...,UUUUUU...,VVVVVV...。在具体的存储模式命名中,planar 格式有时带后缀 P。

semi-planar:将 Y、U、V 三个分量放在两个矩阵(平面)中。Y 占用一个平面,UV 共用一个平面。内存中排列形式类似:YYYYYY...,UVUVUV...。在具体的存储模式命名中,semi-planar 格式有时带后缀 SP。semi-planar 是一种特殊的 planar 格式。

注意:packed 格式通常用于只含水平采样的采样方式。packed 格式不能处理垂直采样,否则会导致不同的行尺寸不一。

YUV 图像存储模式与采样方式密切相关。一种采样模式下有多种不同的存储模式。

存储模式是一种较粗粒度的划分方式,主要依据不同分量在不同 plane 中的排列顺序来划分存储模式,一种存储模式定义了各分量样本在内存中的布局方式,而更一步的细节并不明确。像素格式则是细粒度的划分方式,一种像素格式中图像数据的内存组织方式的所有细节都是确定的,像素格式在第 3 节讲解。

2.5 采样方式 YUV4:4:4

参考图4和表1可知,YUV4:4:4 采样方式中,水平方向,每 1 个像素采样出 1 个色度样本;垂直方向,每 1 个像素采样出 1 个色度样本。以4x4 像素点阵为例,每一个像素都有独立的UV分量可供使用。如下(每个[]为一个像素点):

[ Y U V ]  [ Y U V ]  [ Y U V ]  [ Y U V ]
[ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ]
[ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ]
[ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ]

在这种采样方式下,一个像素点包含的完整的亮度信息和色度信息。

2.6 采样方式 YUV4:2:2

参考图4和表1可知,YUV4:2:2 采样方式中,水平方向,每 2 个像素采样出 1 个色度样本;垂直方向,每 1 个像素采样出 1 个色度样本。

以下图4x4 像素点阵为例进行说明。每 2 个像素共用 1 组 UV 分量。

[ Y U ]  [ Y V ]  [ Y U ]  [ Y V ]
[ Y V ] [ Y U ] [ Y V ] [ Y U ]
[ Y U ] [ Y V ] [ Y U ] [ Y V ]
[ Y V ] [ Y U ] [ Y V ] [ Y U ]

若位深是 8,平均算来,一个像素占用的数据宽度为 16b,其中 Y 占 8b,U 占 4b,V 占 4b。后面存储模式命名中的数字 16 (YU16/YV16/NV16) 指的就是 16b。

在这种采样方式下,一个像素点里含的数据是不完整的,还原出一个像素点,需要相邻的两个像素点数据,如下:

[ Y U ]  [ Y V ]

在同一采样模式下,根据分量元素排列顺序的不同,又分为不同的存储模式:

2.6.1 packed 存储模式

YUYV(YUY2) 模式:

[ Y U ]  [ Y V ]  [ Y U ]  [ Y V ]
[ Y V ] [ Y U ] [ Y V ] [ Y U ]
[ Y U ] [ Y V ] [ Y U ] [ Y V ]
[ Y V ] [ Y U ] [ Y V ] [ Y U ]

YUYV(YUY2) 的 10 bit 版本叫 Y210。YUYV(YUY2) 在 FFmpeg 中定义为 YUYV422。

UYVY 存储模式:

[ U Y ]  [ V Y ]  [ U Y ]  [ V Y ]
[ U Y ] [ V Y ] [ U Y ] [ V Y ]
[ U Y ] [ V Y ] [ U Y ] [ V Y ]
[ U Y ] [ V Y ] [ U Y ] [ V Y ]

2.6.2 planar 存储模式

YU16:

Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
U U U U
U U U U
-------
V V V V
V V V V

YV16:

Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
V V V V
V V V V
-------
U U U U
U U U U

2.6.3 semi-planar 存储模式

NV16:

Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
U V U V
U V U V
U V U V
U V U V

NV61:

Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
V U V U
V U V U
V U V U
V U V U

在 FFmpeg 中,NV16 是 8 bit 位深,NV16 的 10 bit 版本叫 NV20。FFmpeg 中未定义NV61及其 10 bit版本。这几种名称存在于像素格式定义中。

2.7 采样方式 YUV4:2:0

参考图4和表1可知,YUV4:2:0 采样方式中,水平方向,每 2 个像素采样出 1 个色度样本;垂直方向,每 2 个像素采样出 1 个色度样本。

每 4 个像素共用 1 组 UV 分量。若位深是 8,平均算来,一个像素占用的数据宽度为 12b,其中 Y 占 8b,U 占 2b,V 占 2b。后面存储模式命名中的数字 12 (YU12/YV12/NV12) 指的就是 12b。

[ Y U ]  [ Y ]  [ Y U ]  [ Y ]
[ Y V ] [ Y ] [ Y V ] [ Y ]
[ Y U ] [ Y ] [ Y U ] [ Y ]
[ Y V ] [ Y ] [ Y V ] [ Y ]

在这种采样方式下,还原出一个像素点,需要相邻的四个像素点数据,如下:

[ Y U ]  [ Y ]
[ Y V ] [ Y ]

在同一采样模式下,根据分量元素排列顺序的不同,又分为不同的存储模式:

2.7.1 planar 存储模式 YUV420P

YU12/IYUV/I420:

Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
U U
U U
---
V V
V V

YV12:

Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
V V
V V
---
U U
U U

2.7.2 semi-planar 存储模式 YUV420SP

NV12:

Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
U V U V
U V U V

NV21:

Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
V U V U
V U V U

在 FFmpeg 中,NV12 及 NV21 都是 8 bit 位深,NV12 的 10 bit 版本叫 P010。这几种名称存在于像素格式定义中。

FFmpeg中的色彩空间与像素格式2-RGB/YUV色彩空间的更多相关文章

  1. 简述WPF中的图像像素格式(PixelFormats)

    原文:简述WPF中的图像像素格式(PixelFormats) --------------------------------------------------------------------- ...

  2. (转)ffmpeg 中 av_read_frame_internal分析

    作者: chenwei1983    时间: 2012-3-5 04:21 PM标题: ffmpeg 中 av_read_frame_internal分析                       ...

  3. FFmpeg(10)-利用FFmpeg进行视频像素格式和尺寸的转换(sws_getCachedContext(), sws_scale())

    一.包含头文件和库文件 像素格式的相关函数包含在 libswscale.so 库中,CMakeLists需要做下列改动: # swscale add_library(swscale SHARED IM ...

  4. lcd中像素深度bpp和像素格式(比如RGB,YUV)的关系

    像素深度(bits per pixel,简称bpp) 一个像素的颜色在计算机中由多少个字节数据来描述.计算机中用二进制位来表示一个像素的数据,用来表示一个像素的数据位越多,则这个像素的颜色值更加丰富. ...

  5. yuv rgb 像素格式1

    ===========大小============= 一般,直接采集到的视频数据是RGB24的格式 RGB24一帧的大小size=width×heigth×3 Byte, RGB32的size=wid ...

  6. 零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构

    http://www.cnblogs.com/tanlon/p/3879081.html 在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构:  (1) AVF ...

  7. FFmpeg中overlay滤镜用法-水印及画中画

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10434209.html 1. overlay技术简介 overlay技术又称视频叠加技术 ...

  8. [原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构

    在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构:  (1) AVFormatContext  AVFormatContext是一个贯穿始终的数据结构,很多函 ...

  9. (原)ffmpeg中的writing_filter翻译

    本文的主要目的是梳理,记录自己在学习开发ffmpeg视频滤镜的笔记.参考的主要内容是根据ffmpeg中doc下的writing_filter.txt文件以及ffmpeg的源码. author:liha ...

  10. .net下灰度模式图像在创建Graphics时出现:无法从带有索引像素格式的图像创建graphics对象 问题的解决方案。

    在.net下,如果你加载了一副8位的灰度图像,然后想向其中绘制一些线条.或者填充一些矩形.椭圆等,都需要通过Grahpics.FromImage创建Grahphics对象,而此时会出现:无法从带有索引 ...

随机推荐

  1. FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频

    ​Android早期的MediaPlayer控件对于网络视频的兼容性很差,所以后来单独推出了Exoplayer库增强支持网络视频,在<Android Studio开发实战:从零基础到App上线( ...

  2. AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo

    TCP通讯简介 TCP(传输控制协议,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议.它确保数据包按顺序传输,并在必要时进行重传,以保 ...

  3. 【Kernel】基于 QEMU 的 Linux 内核编译和安装

    目录 安装虚拟机系统 共享目录 编译内核 卸载内核 参考资料 本文主要记录个人做存储系统研究时,在 QEMU 环境下编译和安装 Linux 内核的过程 安装虚拟机系统 之前在 利用 RocksDB + ...

  4. RK3568,字符设备框架:管理同主设备号、不同次设备号设备

    字符设备框架:管理同主设备号.不同次设备号设备 以下代码针对迅为开发板RK3568,开发板系统是ubuntu20.04, 正文 以下是我写的字符设备框架,实现了管理同主设备号.不同次设备号的功能. 代 ...

  5. Ubuntu 无法播放MP4

    今天用ubuntu打开mp4发现无法播放,然后我以为文件损坏了,就传到手机上面,发现还是可以播放的,然后就查了一下相关资料,发现有人让我安装这个 sudo snap install ffmpeg 安装 ...

  6. vue遇到Conflicting order. Following module has been added:(加载顺序冲突)

    其中article.vue和topGroup.vue这两个文件在模块unitTest和wrongBook上出现加载冲突 其中一个文件先加载topGroup.vue文件其中一个文件先加载article. ...

  7. python匹配一个最近时间的文件

    def new_report(bakdir,str): files = os.listdir(bakdir) lists = [] #列出目录的下所有文件和文件夹保存到lists for f in f ...

  8. JDocumentEditor

    package infonode; /** * * @author sony */ //JDocumentEditor.java import java.awt.*; import java.awt. ...

  9. golang之json.RawMessage

    RawMessage 具体来讲是 json 库中定义的一个类型.它实现了 Marshaler 接口以及 Unmarshaler 接口,以此来支持序列化的能力.注意上面我们引用 官方 doc 的说明. ...

  10. Mongodb4.4安装与使用

    MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能 最丰富,最像关系数 ...