赞
踩
笔者按:最近要做算法层面的HDR/SDR互相转换相关的内容,但是对HDR相关的内容真的没有一个很全面的认识。HDR转SDR还好,都是0~255的8bit图像;但是如果SDR转HDR,转换出来的图像在不同的显示器上观感差距巨大。所以就对这个东西比较迷惑。这篇图像就尝试来弄清楚,这些HDR标准,在技术细节上都是怎么样的,包含哪些内容,有哪些区别。此外,对于一些共性的知识,这里也会给出讲解。
目录
动态元数据 SMPTE ST 2094-40(HDR10+)
HDR是High Dynamic Range的缩写。简要理解:通常的图像包含0~255 8个bit,即在每个颜色通道只有256个level,但实际场景中的亮度差别要比这8个bit大得多,所以就有了10 bit 甚至12 bit的HDR需求。
定义上讲,指的是在色彩再现中能够准确表现出来的颜色子集。
色域通常表示为 CIE 1931 色度图中的区域,弯曲的边缘表示单色(单波长)或光谱颜色
实际上这个色域模型应该是一个3D的锥形,但是Z轴表示的是亮度。我们看到的这个图形实际上是其在xy平面的一个投影。能访问的色域多少除了在xy轴的包围面积以外,还包括亮度能到多少。
上图是sRGB色彩空间的三维表示。注意亮度越高,实际上这个截面积越小。
我们以下将要讨论的颜色空间,都是在这个3D色域空间中定义的。
其实就是standard RGB的缩写。在没有color profile的情况下,sRGB一般作为标准的颜色空间使用。
sRGB使用和ITU-R BT.709 相同的原色和白点,但是没有用BT.709 非线性传递函数,也就是大名鼎鼎的gamma传输函数。
其色域空间参数为:
其传输函数大部分为gamma2.2,但是在接近0的部分有一点线性调整,以避免gamma具有无限斜率
DCI-PC也分为三种,他们之间略有区别,他们的空间参数定义为:
此外还有一些如DCI-P3+, Cinema Gamut的色域,都是基于DCI-P3来设定的
他们有的用Gamma 2.2,有的用2.6,但基本都是用gamma作为传输函数
这个色域主要用在影视创作行业。
在adobe RGB空间中,为了显示准确的颜色,显示器的亮度必须在白点为 160.00 cd/m2,在黑点为 0.5557cd/m2,这意味着对比度为 287.9。此外,黑点应具有与白点相同的色度,但亮度等于白点亮度的 0.34731%。显示器关闭时显示器面板上的环境照明度必须为 32 lx。
与sRGB相同,adobe RGB的RGB分量值和亮度值不成线性比例,而也是一个2.2的gamma函数。
其空间参数如下:
其和sRGB的比较:
准确来说Rex XXXX是一个标准,不仅仅包括颜色空间,还有帧率,分辨率,等等内容,但是这里仅仅讨论颜色空间的内容。(下同)
其色彩空间参数为:
Rec 709还指定了OETF,但没有指定EOTF(关于这两个缩写,请往后看)
其色彩空间参数为:
Rec 2020指定的OETF与709的函数相同,但是给出的参数精度要高一些
Rec 2020可以使用YCbCr空间表示,Y′ = KR⋅R′ + KG⋅G′ + KB⋅B′
其中KR = 0.2627, KG = 1−KR−KB = 0.678 and KB = 0.0593
Cb和Cr计算为
C′B = 0.5⋅(B′−Y′)/(1−KB) = (B'−Y′)/1.8814
C′R = 0.5⋅(R′−Y′)/(1−KR) = (R′−Y′)/1.4746
还有一种YcCbcCrc的转换,与之类似,但是使用的RGB值是线性RGB(RAW图像中的RGB值)
这里不再赘述
色域和2100一样。
Rec.2100 指定使用 RGB、YCbCr 和 ICtCp的信号格式。ICtCp 提供改进的颜色表示,专为高动态范围 (HDR) 和宽色域信号 (WCG) 而设计。
亮度计算方法和2020一样。
光电传递函数opto-electronic transfer function (OETF)是以场景光为输入,转换成图片或视频信号为输出的传递函数。这通常在相机内完成。
电光传递函数 electro-optical transfer function(EOTF) 是将图像或视频信号作为输入并将其转换为显示器的线性光输出的传递函数。 这是在显示设备内完成的。
光电传递函数 opto-optical transfer function (OOTF)(OOTF)是以场景光为输入,显示光为输出的传递函数。 OOTF 是 OETF 和 EOTF 的结果,通常是非线性的。
拍照时会有一些RAW文件,这些RAW文件的TF就是线性函数。
相机公司为自己的相机开发了一些OETF,这里不再赘述。
下面单独讲下BT1886,Rec709/2020,PQ和HLG。
这个EOTF是专门用于SDR内容的,是一个gamma2.4的传输函数。
L是屏幕亮度
V是输入的信号值,0~1
γ=2.4
Lw是屏幕的白色亮度
Lb是屏幕的黑色亮度
PQ的EOTF
是非线性信号值(理解为RGB值),值为0~1
是显示的亮度
然后它还有逆向EOTF,即从显示数据恢复到本身的值,这里按下不表。
这个函数的优点在于,其可以向后兼容SDR的gamma曲线的传递函数。
这个函数通常用在HLG的HDR内容中(这个格式使用HLG的传输函数,BT.2020的颜色原色和10bit的颜色深度,具体内容后面会讲到。)
HLG的EOTF定义为
(wiki中就是这么写的。。。愁人)
是非线性信号值(理解为RGB值),值为0~1
是显示的亮度
Lw和Lb和上面定义类似。
所以,这里还要贴出来HLD的OETF和OOTF
HLG的OETF有两个定义:
在ARIB STD-B67中定义为
在Rec. 2100中定义为:
一般还是用Rec 2100多一些
E指的是光照强度 0~1
E'指的是信号强度(RGB
a = 0.17883277, b = 1 - 4a = 0.28466892, c = 0.5 - a ln(4a) = 0.55991073
HLG的OOTF为:
Ys是归一化的线性场景亮度
α是显示器峰值亮度
γ=1.2(当α=1000 cd/m2的时候
在HDR10中用到了SMPTE ST 2086定义的静态元数据,包括最大最小亮度、三基色坐标、最大内容亮度MaxCLL、最大平均内容亮度MaxFALL,具体定义如下:
由显示原色、白点色度、最大显示主控亮度和最小显示主控亮度组成的组应定义主控显示的颜色量
亮度和色度坐标的值范围
xy 色度坐标,x 坐标应在 [0.0001, 0.7400] 范围内,y 坐标应在 [0.0001, 0.8400] 范围内,四位小数
任何颜色应该表示为三原色之和,所以在显示时应该表示为xr, yr, xg, yg, xb, yb
母带中白点的颜色,用于白平衡,一般是6500k色温设置为白点
母带中最大的峰值亮度,范围5~10000 cd/m2(nit),取整数
母带中最小的峰值亮度,范围0.0001~5.0000 cd/m2(nit),取0.0001的倍数
SMPTE ST 2094定义了动态元数据,其中常用的有SMPTE ST 2094-10和SMPTE ST 2094-40,前者对应杜比视界,后者对应HDR10+。他们又都基于SMPTE ST 2094-1。关于这部分内容后面介绍相应的HDR格式的时候会详细去讲。
参见ST 2084/86-PQ-HLG,我正试图搞清楚 - 知乎 (zhihu.com)
上面提到的SMPTE ST 2084/2086/2094/ BT 601/709/2020/2100等东西很容易就把人绕晕了。这里辨析一下:
SMPTE ST 2084是比较特殊的一个标准,和2086/2094不同,其主要是定义了PQ曲线,也就上上面讲到的一种EOTF。
SMPTE ST 2086/2094 虽然和2084长得比较像,但其实是不一样的存在。2086/2094在PQ的基础上,添加了metadata的内容。
2086定义了静态元数据,而2094定义了动态元数据,有两个变种:
SMPTE ST 2094-10=DolbyVision
SMPTE ST 2094-40=HDR10+
ffmpeg压缩参数中,HDR10的transfer=smpte2084,HLG的transfer=arib-std-b67
BT.2100标准提供两条伽玛曲线作为不同类型生产工作的标准。
对于互联网流媒体和电影:
PQ (感知量化)
对于广播电视:
HLG (混合对数伽玛)
PQ伽玛曲线基于人类视觉感知的特征,并且最适合于在互联网上制作电影或串流视频的内容,其中再现准确性是关键。
另一方面,HLG伽玛曲线旨在允许在现有的SDR电视上显示而不会看不到位置,并且最适合于广播电视和直播视频馈送。
有了以上这些相关的知识储备以后,就可以理解几种HDR的区别了
HDR10的定义包括:
HDR10在技术上被限制为最大 10,000 尼特的峰值亮度,但普通 HDR10 内容的峰值亮度为 1,000 到 4,000 尼特。
HDR10 不向后兼容 SDR 显示器(即SDR显示器无法显示HDR10内容)
此外,在不同的显示器上,如色彩量或者峰值亮度较低的HDR10显示器上,静态元数据可以帮助调整显示内容。但是HDR10的元数据是静态的,即对整个视频都是相同的,对每一帧/不同的分镜场景并没有特别的调整,所以在还原创作意图上可能会有些问题
PQ10在定义上和HDR完全相同,除了一点:没有静态元数据。
在HDR10源文件中添加动态元数据就可以实现HDR10+了。
HDR10+可以用HEVC和VP9等任何支持ITU-T T.35的编解码器
通常来讲HDR10+和Dolby Vision这种格式比较适合流媒体,即网上播放已经存储好的视频;但实际上也可以用于直播,只需要HEVC 编码器在直播内容中生成和注入元数据,手机录制视频并在录制过程中实时创建 HDR10+元数据。
HDR10+ 元数据遵循 ITU-T T.35,并且可以与其他 HDR 元数据共存,例如 HDR10 静态元数据,使 HDR10+ 内容向后兼容 与非 HDR10+ 电视。不支持该格式的设备会忽略 HDR10+ 元数据,并以 HDR10 播放视频。
其动态元数据格式为SMPTE ST 2094中定义的元数据格式的一种变体SMPTE ST 2094-40 。
HDR10+ 在逐个场景甚至逐帧的基础上发出动态范围和场景特征的信号。然后显示设备使用动态元数据通过动态色调映射过程应用适当的色调映射。 动态色调映射与静态色调映射的不同之处在于从场景到场景应用不同的色调曲线,而不是对整个视频使用单一色调曲线。
HDR10+的格式识别码
这一项表示了元数据适用的时间范围,从合适开始,持续多久
这一项表示了元数据适用的空间范围,在哪个patch适用。WindowNumber是一个标识符,通常是默认为0。如果为图像的同一像素定义了多个元数据集并具有相同的 TargetedSystemDisplay 元数据值,则具有最高 WindowNumber 的集决定了最后的输出。
最后这个椭圆的意义是除了方形window之外还定义一个椭圆window,然后内部和外部椭圆之间有一个过渡带,用来避免伪影。
对于每个目标系统,一个图像内最多应有 3 个处理窗口。处理窗口 0 应始终存在,并应覆盖图像中的所有像素,并且不应使用椭圆像素选择器进行扩展。处理窗口 1 和 2(如果存在)应使用椭圆像素选择器进行扩展
第一个比较好理解。
第二个参数是是一个双输入采样函数。
它的第一个输入是:FractionBrightPixels。FractionBrightPixels 应该是一个数字,表示图像中包含场景中最亮像素的选定像素的比例。 FractionBrightPixels 应在 [0,1] 范围内且为 0.001 的倍数。 它的计算放在附录里面。
第二个输入是:AverageMaxRGB。线性化maxRGB的平均值。
HDR10+颜色体积变换基于基于场景的颜色体积映射。定义的参数如上。
MaxSCL,Maximum Scene Color Component Levels,指的是应该是场景中线性化 RGB 值的每个分量的最大值。AverageMaxRGB 应为场景中线性化 maxRGB 值的平均值。
DistributionMaxRGB 应该是一组两个等长向量。第一个向量中的每个元素应为 [0,100] 范围内的整数值。第二个向量中的值应在 [0,1] 范围内且为 0.00001 的倍数。第二个向量中位置 i 处的元素应是场景中线性化 maxRGB 值的百分之a低于该值的值。
FractionBrightPixels 应该是一个数字,表示图像中包含场景中最亮像素的选定像素的比例。 FractionBrightPixels 应在 [0,1] 范围内且为 0.001 的倍数。 FractionBrightPixels 的计算在附录中。
三个可选参数先略过。
给定RGB的线性输入分量
尝试计算输出输出。
首先计算Source Normalized Actual Peak Luminance,个人理解该值指的是当前图像的亮度(根据场景归一化
其中
然后计算Target Normalized Actual Peak Luminance,个人理解值得是当前图像的亮度(根据显示器归一化
其中
然后,计算归一化的RGB值
其中
然后要根据场景和参数进行tone mapping:
其中
再其中Fn是:
再再其中
当场景中的一种颜色分量明显大于其他颜色分量时,与创作意图(或图像本质)相比,生成的色调映射场景会变得更暗。这可以使用调光调整因子进行调整:
上图中,Δ= 2 和 T = 16,
此外,还有一种用贝塞尔曲线进行色调映射的方法
对应于metadata中的
其中
其中三个参数P1~P3控制了贝塞尔曲线的形状
后面还有一个饱和度控制参数,用于饱和度色调映射:
首先将图像转换到YCBCR,饱和度映射之后再转回来,转换过程:
其中:
然后再YCbCr空间进行饱和度转换:
其中
里面的两个fSCSM和η这里贴出来:
其中
η通过以下几个式子解:
其中M下面会给出。
在饱和度映射后,再转回RGB:
其中
上面提到,HDR10+中还有一个椭圆的window,这个window和外面有一个过度,那么这里就需要计算这个过度的权重
在椭圆中,我们可以计算出某个像素到外部椭圆的焦点的距离的归一化和为:
权重可以按照下面计算:
权重计算后,还需要考虑加权方法,其一是alpha混合:
其中
还有种方法就是,按照图层优先进行加权,这个适用于多个椭圆都覆盖到同一个像素的情况。那么这个时候,window1就比window2优先,就只考虑window1。如果window1的权重为0,那么再考虑window2
但是和HDR10+类似,在显示器的性能比较低的时候,会根据动态元数据,讲内容映射到正确的显示范围。
这两者是杜比视界的识别码,和其它格式做区分。
这一项表示了元数据适用的时间范围,从合适开始,持续多久
这一项表示了元数据适用的空间范围,在哪个patch适用。WindowNumber是一个标识符,通常是默认为0。如果为图像的同一像素定义了多个元数据集并具有相同的 TargetedSystemDisplay 元数据值,则具有最高 WindowNumber 的集决定了最后的输出。
对应了静态元数据中的响应的项,分别是屏幕的三原色xy坐标,白点坐标,最大亮度,最低亮度
这一部分没有在SMPTE ST 2094-1中定义,是杜比视界特有的动态元数据
杜比视界的颜色体积变换基于色调映射,其中ImageCharacteristicsLayer根据图像计算了一些图像的特征,比如(最小、最大、平均的PQ编码maxRGB值)
这里涉及到一个Reduced Pixel Set的概念,就是说在计算这些值的时候,是在Reduced Pixel Set上计算的。这个Set是这么计算的:从ProcessingWindow的左上角开始,将ProcessingWindow划分为不重叠的样本区域,每个区域包含2x2个像素,每四个像素计算一个平均值,通过这种方式计算一个半分辨率的图像。(涉及到越界的时候只计算边界内部的像素)
对深度学习有理解的就可以当作一个平均池化层。
然后其中包含的三个PQencodedMAXRGB就是在这个Reduced Pixel Set上计算得到的相应(最小、平均、最大)的PQ编码的MAXRGB编码值。其值应为 [0, 1] 范围内的数字,且为 0.00001 的倍数。
就像其命名,ManualAdjustmentLayer这一部分是手动设置的参数。前三个是一个和上面的相应量相加的offset。应该满足
后面的三个ToneMapping参数,将应用于方程:
其中
后面的ChromaCompensationWeight,SaturationGain参数分别控制色度、饱和度。
最后一个ToneDetailFactor参数控制细节。
假设我有一个线性RGB(没有经过gamma变换的RAW图像,或者日常的图像反gamma变换后)的图像,首先将Di∈R,G,B转换到亮度域:
其中Ei是映射后的颜色分量亮度,Di是输入的线性亮度,c1~c3如下
而其中x1~x3,y1~y3为
这里x1~x3和y2是未知的,那么
其中
求出来Ei以后,再根据ToneMapping的相关内容去调整显示的内容:
其中:
这里乘了一个y3,就完成了对显示器的性能的映射。
得到颜色映射后的Fi(RGB)后,再转换到亮度域,比方说电影中常用:
然后再调整色度和饱和度:
其中
然后再进行细节控制:
其中
挖个坑
其中
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。