Noun explanation
ITU:国际电信联盟 International Telecommunication Union
ITU-R:国际电信联盟无线电通信部门 ITU Radiocommunication Sector
CIE :国际照明协会 (英文:International Commission on Illumination
,法文:Commission internationale de l'éclairage
,采用法文缩写:CIE )
SMPTE:电影电视工程师协会 Society of Motion Picture and Television Engineers
Hue:色调 色彩 色相
Chroma:色调饱和度 浓度
Luminance:亮度 明度
HDR Concept
HDR:High Dynamic Range
字面上是动态范围,一般指亮度上可以表达更大的亮度范围,呈现更大的亮度对比度。但是实际实际上HDR的技术和标准涉及色彩相关的一组属性的改善,可以带来更多的颜色、更大的亮度对比度、更高精度的量化。
OETF/EOTF: Optical-Electro/Electro-Optical Transfer Function 光电/电光转换函数
人对亮度的感知是非线性的,对暗部细节敏感,对亮部细节不敏感,利用这个特点设计了非线性的光电转换和电光转换的函数。这样的处理不仅可以节省带宽,也可以基本满足用户体验需求。
光电转换的时候做了特殊的非线性编码,为暗部细节分配更多的码率,亮部细节进行了压缩或者截断减少码率的分配。电光转换进行显示还原的时候,通过应用一个逆的非线性变化,还原出线性光。
Info
通过mediainfo 查看一个HDR视频信息
Video | |
---|---|
ID | 1 |
Format | HEVC |
Format/Info | High Efficiency Video Coding |
Format profile | Main 10@L5@High |
Codec ID | hvc1 |
Codec ID/Info | High Efficiency Video Coding |
Duration | 14 s 0 ms |
Bit rate | 123 kb/s |
Width | 3 840 pixels |
Height | 2 160 pixels |
Display aspect ratio | 16:9 |
Frame rate mode | Constant |
Frame rate | 30.000 FPS |
Color space | YUV |
Chroma subsampling | 4:2:0 |
Bit depth | 10 bits |
Scan type | Progressive |
Bits/(PixelFrame)* | 0.000 |
Stream size | 211 KiB (98%) |
Title | Core Media Video |
Encoded date | UTC 2020-06-14 21:45:40 |
Tagged date | UTC 2020-06-14 21:47:33 |
Color range | Limited |
Color primaries | BT.2020 |
Transfer characteristics | HLG |
Matrix coefficients | BT.2020 non-constant |
Codec configuration box | hvcC |
下面几个参数属于元数据 ,可能没有 后文会讲到
Video | |
---|---|
Mastering display color primaries | Display P3 / R: x=0.677980 y=0.321980, G: x=0.245000 y=0.703000, B: x=0.137980 y=0.052000, White point: x=0.312680 y=0.328980 |
Mastering display luminance | min: 0.0001 cd/m2, max: 1000 cd/m2 |
Maximum Content Light Level | 1000 cd/m2 |
Maximum Frame-Average Light Level | 400 cd/m2 |
重点关注 :
- Color range :色彩范围
- Color primaries :色彩原色
- Transfer characteristics :传输特性
- Matrix coefficients :矩阵系数
元数据字段
- Mastering display color primaries
- Mastering display luminance
- Maximum Content Light Level
- Maximum Frame-Average Light Level
部分参数可以通过ffprobe查看对应的选项 ffprobe -h >> ffprobe.txt
Color range
色彩范围主要是两个:
- Full range (PC range )
- Video range(limited range,tv range)
Full Range 就是我们所熟悉的 [0, 255],而在 Limited Range 中,Y’ 的值被限制在 [16, 235],Cb 和 Cr 的值被限制在 [16, 240] (针对8bit的)。
HDR一个重要属性就是量化精度。
SDR技术使用8bit进行颜色的表达,而HDR使用10bit/12bit进行颜色的表示,从而减少了8bit容易出现的人为条带效应。
ios 中的精度 & 色彩范围 :
1 | kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange = '420v', /* Bi-Planar Component Y'CbCr 8-bit 4:2:0, video-range (luma=[16,235] chroma=[16,240]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct */ |
1 | kCVPixelFormatType_420YpCbCr8BiPlanarFullRange = '420f', /* Bi-Planar Component Y'CbCr 8-bit 4:2:0, full-range (luma=[0,255] chroma=[1,255]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct */ |
关于为什么要将YUV量化为tv range 16-235 ?
以下是维基百科摘抄的一段, 意思是tv range是为了解决滤波(模数转换)后的过冲现象,
Y′ values are conventionally shifted and scaled to the range [16, 235] (referred to as studio swing or “TV levels”) rather than using the full range of [0, 255] (referred to as full swing or “PC levels”). This practice was standardized in SMPTE-125M in order to accommodate signal overshoots (“ringing”) due to filtering. The value 235 accommodates a maximal black-to-white overshoot of 255 − 235 = 20, or 20 / (235 − 16) = 9.1%, which is slightly larger than the theoretical maximal overshoot (Gibbs phenomenon) of about 8.9% of the maximal step. The toe-room is smaller, allowing only 16 / 219 = 7.3% overshoot, which is less than the theoretical maximal overshoot of 8.9%. This is why 16 is added to Y′ and why the Y′ coefficients in the basic transform sum to 220 instead of 255.^[9]^ U and V values, which may be positive or negative, are summed with 128 to make them always positive, giving a studio range of 16–240 for U and V. (These ranges are important in video editing and production, since using the wrong range will result either in an image with “clipped” blacks and whites, or a low-contrast image.)
Color primaries
一般理解为色域,色域指可以显示的所有颜色的范围,常见的有Rec.709(全高清广播标准)、Rec.2020(4K/8K广播标准BT.2020)、Adobe RGB、P3等。
- bt709
- unknown
- reserved
- bt470m
- bt470bg
- smpte170m
- smpte240m
- film
- bt2020
- smpte428
- smpte431
- smpte432
下图显示了人眼能够感知的所有RGB值的范围。三角形表示色域:三角形越大,可以显示的颜色越多。
这张马蹄形的图上面可以看到HDR使用的色域是BT2020, SDR使用的是BT709,可以明显看到HDR的色域大于SDR。
理解颜色空间:
颜色空间 由 颜色模型 跟 色域 共同定义。
颜色模型的概念为:一种抽象数学模型,通过一组数字来描述颜色(例如RGB使用三元组、CMYK使用四元组)
例如Adobe RGB和sRGB都基于RGB颜色模型,但它们是两个不同的颜色空间,因为色域不一样
Color Transfer
描述光电转换过程的视频属性也叫颜色传输函数Color Transfer
就是上面表格里面的 Transfer characteristics
常见的hdr转换曲线为HLG和PQ,其中,smpte2084为PQ曲线(感知量化)
,arib-std-b67为HLG曲线(混合对数伽玛)
- bt709
- unknown
- reserved
- bt470m
- bt470bg
- smpte170m
- smpte240m
- linear
- log100
- log316
- iec61966-2-4
- bt1361e
- iec61966-2-1
- bt2020-10
- bt2020-12
- smpte2084
- smpte428
- arib-std-b67
传统的SDR视频使用的BT709的光电转换函数,对高亮部分进行了截断,可以表达的亮度动态范围有限,最大亮度只有100nit。而HDR视频,增加了高亮部分细节的表达,很大的扩展亮度的动态范围。
不同HDR的设计初衷不同,其中PQ的设计更接近人眼的特点,亮度表达更准确,可以表示高达10000nit的亮度。而HLG的设计考虑了老设备的兼容性,和传统bt709的传输函数有部分是重合的,天然的对老设备具有一定兼容性
Metadata
HDR元数据分为两种,静态元数据 和动态元数据 ;
使用PQ曲线的HDR10是采用静态元数据的,但是杜比公司提出来的杜比视界和三星的HDR10+,尽管使用了PQ曲线,但是他们使用的是动态元数据,HLG没有元数据。
其中 DolbyVision 等价于SMPTE ST 2094-10, HDR10+ 等价于 SMPTE ST 2094-40
静态元数据规定了整个片子像素级别最大亮度上限,在ST 2086中有标准化的定义。静态元数据的缺点是必须做全局的色调映射,没有足够的调节空间,兼容性不好。
动态元数据可以很好地解决这个问题。动态元数据主要有两个方面的作用:与静态元数据相比,它可以在每一个场景或者每一帧画面,给调色师一个发挥的空间,以展现更丰富的细节;另一个方面,通过动态元数据,在目标显示亮度上做色调映射,可以最大程度在目标显示器上呈现作者的创作意图。
- 最大内容亮度(MaxCLL):整个视频流中最亮像素的亮度。
- 最大帧平均亮度(MaxFALL):整个视频流中最亮帧的平均亮度
另外解释一下多出现的几个参数:progressive,SAR,DAR.
progressive,其实就是扫描方式,逐行扫描.另外的一种方式就是隔行扫描:interlaced.我们平时所谓的1080p,这个p就是progressive,表示的是1080尺寸的逐行扫描视频.
DAR - display aspect ratio就是视频播放时,我们看到的图像宽高的比例,缩放视频也要按这个比例来,否则会使图像看起来被压扁或者拉长了似的。
SAR - storage aspect ratio就是对图像采集时,横向采集与纵向采集构成的点阵,横向点数与纵向点数的比值。比如VGA图像640/480 = 4:3,D-1 PAL图像720/576 = 5:4
PAR - pixel aspect ratio大多数情况为1:1,就是一个正方形像素,否则为长方形像素这三者的关系PAR x SAR = DAR或者PAR = DAR/SAR
Tone Mapping
色调映射的目的是使高动态范围HDR图像能够适应低动态范围LDR显示器。
色调映射算法的目的在于将HDR图像的亮度进行压缩,进而映射到LDR显示设备的显示范围之内,同时,在映射的过程中要尽量保持原HDR图像的细节与颜色等重要信息。
所以色调映射算法需要具有两方面的性质:
- 能够将图像亮度进行压缩。
- 能够保持图像细节与颜色。
EOTF/OETF
HLG
1 | float ARIB_B67_A = 0.17883277; |
PQ
1 | highp float ST2084_M1 = 0.1593017578125; |
BT.709
1 | const float REC709_ALPHA = 1.09929682680944; |
bt2020 -> bt709
1 | 1.6605, -0.5876, -0.0728 |
bt709 -> bt2020
1 | 0.6274, 0.3293, 0.0433 |
Matrix coefficients
YCbCr->RGB
- Video Range
1 | // BT.601, which is the standard for SDTV. |
- Full Range
1 | // BT.601 full range |
OpenGL
- Video Range
1 | precision mediump float; |
- Full Range
1 | precision mediump float; |
RGB-YUV
1 | // FULL RANGE |
1 | inline CFDictionaryRef HDRAttachmentsOfMedium(void) |
1 | CVPixelBufferRef RGB2YCbCr10Bit(CVPixelBufferRef pixelBuffer, CFDictionaryRef dic) |
Formula
BT.601 | BT.709 | BT.2020 | |
---|---|---|---|
a | 0.299 | 0.2126 | 0.2627 |
b | 0.587 | 0.7152 | 0.6780 |
c | 0.114 | 0.0722 | 0.0593 |
d | 1.772 | 1.8556 | 1.8814 |
e | 1.402 | 1.5748 | 1.4747 |
1 | Y = a * R + b * G + c * B |
1 | R = Y + e * Cr |
1 | a+b+c = 1 |
- https://www.itu.int/rec/R-REC-BT.601
- https://www.itu.int/rec/R-REC-BT.709
- https://www.itu.int/rec/R-REC-BT.2020
Range Deduce
1 | [16/255, 16/255, 16/255, 1.0] |
将 videorange 通过 齐次矩阵
转换为 fullrange
Other
大部分图像捕捉设备在保存图像时会自动加上伽马校正,也就是说图像中存储的是非线性空间中的颜色
非线性的RGB转换为YUV也是非线性
OpenGL 无法直接对 10bit YUV 进行处理,需要先转换为 8bit YUV
tone mapping 需要在线性RGB空间进行
References
搞清楚编程中YUV和RGB间的相互转换
YUV - RGB colorconversion
推导视频YUV转RGB矩阵
齐次坐标
# Gamma校正
# 我理解的伽马校正
Colour gamut conversion from Recommendation ITU-R BT.2020 to Recommendation ITU-R BT.709
Colour conversion from Recommendation ITU-R BT.709 to Recommendation ITU-R BT.2020
HDR转SDR实践之旅