返回书架摄影成像科学

第十章:静态 RAW、视频 RAW、压缩与元数据

同一个 RAW 换两种软件打开,初始颜色、暗部颗粒和边缘锐度可能都不同。文件中的 样本没有改变,显影软件却选择了不同的白平衡、颜色变换、去马赛克和降噪方法。 另一方面,拍摄时已发生的饱和或有损压缩会限制这些选择。了解一个 RAW 文件, 既要知道保存的数怎样解释,也要知道哪些处理已在写入前完成。第九章在保持文件码 不变时比较了不同监看设置;这里通过文件样本、标签和解码步骤核对这些数据。

10.1 RAW 的六维描述

定义 10.1(RAW 数据契约). 本书把 RAW 定义为一种面向后期显影的相机相关数据 契约。描述一个 RAW 至少需要六个维度:

  1. 采样状态:马赛克、分箱、全 RGB、去马赛克线性;
  2. 响应状态:线性传感器值、分段线性、Log 或非线性压缩;
  3. 数值表示:有效位深、打包位深、整数/浮点、黑白电平;
  4. 压缩:无压缩、无损、有损、帧内或跨帧;
  5. 已处理项目:坏点、暗场、镜头阴影、降噪、锐化、HDR 融合;
  6. 元数据:CFA、曝光、白平衡建议、颜色矩阵、镜头、时码和校验信息。

仅说“12 bit RAW”只回答第三项的一部分。

10.2 静态 RAW 的基本结构

典型 Bayer RAW 保存每个感光单元一个数值,加上解释这些数值所需的元数据。解码器 通常执行:

打包码值→解压与线性化→黑电平/坏点校正→去马赛克→白平衡与颜色矩阵→降噪、色调与输出编码.\begin{aligned} \text{打包码值} &\rightarrow \text{解压与线性化}\\ &\rightarrow \text{黑电平/坏点校正}\\ &\rightarrow \text{去马赛克}\\ &\rightarrow \text{白平衡与颜色矩阵}\\ &\rightarrow \text{降噪、色调与输出编码}. \end{aligned}

DNG 建立在 TIFF/EP 结构上,可记录 CFA 图样、BlackLevel、WhiteLevel、线性化表、 颜色矩阵、噪声模型和预览等。DNG 也允许保存已经去马赛克的 LinearRaw。因此文件 扩展名 .dng 不能单独证明数据仍是原始马赛克。

图 10.1 RAW 显影流程及可重新选择的步骤

图 10.1 箭头是典型逻辑顺序,不表示所有相机都在同一位置执行每一步。只要某项 已经在写入前不可逆完成,后期就只能调整其结果,不能回到原始样本重新选择。

读取 DNG 时,至少应核对下列标签族。标签存在只表示解码器获得了一个声明,不保证 标定值准确,也不保证相机没有在写入前做其他处理。

标签或标签族解释对象缺失或误读的后果
CFARepeatPatternDim、CFAPattern感光单元的滤色排列通道位置错误,去马赛克失效
BlackLevel、BlackLevelRepeatDim每通道/每周期黑电平阴影偏色,线性比例错误
WhiteLevel当前样本的有效白点归一化与高光重建错误
LinearizationTable码值到线性化样本的查表变换把非线性码误当线性曝光
ActiveArea、DefaultCrop光学黑区、有效区与建议裁切把遮光像素混入图像或尺寸误判
AsShotNeutral拍摄时建议的中性通道比例失去拍摄白平衡起点,但不等于失去 RAW
ColorMatrix1/2、CalibrationIlluminant1/2指定标定光源下 XYZ 到参考相机原生通道的矩阵方向读反会产生错误的色度变换
ForwardMatrix1/2白平衡相机通道到 D50 XYZ 的前向矩阵不能与 ColorMatrix 直接互换
NoiseProfile信号相关噪声模型降噪与不确定度估计失去相机提示
OpcodeList1/2/3规定阶段的校正操作忽略时可能遗漏坏点、增益图或几何校正

ColorMatrix 的名称尤其容易引起误读。按 Adobe DNG 规范,它把 XYZ 变到参考相机 原生空间;ForwardMatrix 则把白平衡后的相机颜色变到 D50 XYZ。真实流程还涉及 CameraCalibration、AnalogBalance、白平衡和必要的色适应。第七章写作 MM 的相机 到 XYZ 矩阵,不能直接用文件中的 ColorMatrix 原样代入。标签的方向、参考白点和 输入是否已白平衡,必须同时匹配。规范定位见资料源的 DNG 条目。

例子 10.2(黑白电平归一化). 假设样本已按规范完成线性化,RAW 值为 y=5000y=5000 DN,通道黑电平 B=512B=512,白电平 W=15 360W=15\,360。归一化线性值为

x=y−BW−B=448814848≈0.3023.x=\frac{y-B}{W-B} =\frac{4488}{14848}\approx0.3023.

若直接除以 214−12^{14}-1,会把黑电平当作曝光,得到错误的阴影与通道比例。含 LinearizationTable 的文件应先查表,再在规范规定的线性化尺度上应用黑白电平; 逐行、逐列或周期性黑电平也需按标签求值,不能只减一个全图常数。

若黑电平随位置改变,DNG 的归一化分母使用该样本平面的最大计算黑电平与 WhiteLevel 之差;不能把例 10.2 的常数黑电平公式逐像素照搬为变化的分母。该处理顺序见 DNG 1.7.1.0 第 5 章,第 99 页。

减黑后的小负值是噪声分布的一部分,过早裁成零会使暗部均值偏高。以零信号、 Gaussian 噪声 Z∼N(0,σ2)Z\sim\mathcal N(0,\sigma^2) 为例,直接裁切后

E[max⁡(Z,0)]=∫0∞z2πσe−z2/(2σ2) dz=σ2π>0.(10.3)\mathbb E[\max(Z,0)] =\int_0^\infty\frac{z}{\sqrt{2\pi}\sigma} e^{-z^2/(2\sigma^2)}\,dz =\frac{\sigma}{\sqrt{2\pi}}>0. \tag{10.3}

因此用于测噪和多帧平均的中间数据应保留有符号或浮点值;显示时如何处理黑端另行 决定。白点同样要用当前模式的标签值,不假定它总等于容器最大整数。

打开一个可以逐码核对的小文件

下载教学DNG。它由本书生成:32×32的RGGB, 16 bit小端未压缩存储,样本有效白点4095、黑电平64,全部1024个码都已知。 第一个样本为32,用来保留黑位以下的有符号归一化;随后两个样本为64和4095, 分别检查零点和白点。文件用于核对结构和样本读数,按本书许可分发。

起始选中黑位以下的第0号样本,先沿高亮字节找到它的整数值,再看减黑后的有符号结果。 选“白电平样本”核对白点; 最后切换“错误字节序”与“忽略黑电平”,分别判断错误发生在读取整数还是解释样本的阶段。

互动示意:微型DNG的IFD标签、CFA样本与黑白电平逐码核对

互动示意:从真实TIFF字节流读取IFD、条带偏移、CFA和黑白电平,再与生成数组 逐码比较。格子的底色与字母标识CFA滤色通道,数字仍是该位置的RAW样本值(DN)。

本例把ColorMatrix1设为单位矩阵,方便核对标签布局;实际色度变换须使用相机的 标定数据。标签的含义按 Adobe DNG 1.7.1.0,2023年9月规范 第3—5章核对;样本只使用较早版本已有的兼容字段。读者可先查看样本字节,再打开 “错误字节序”:这会改变解出的整数;忽略黑电平则只改变归一化,文件样本仍一致。 这两种错误处在不同层,不能都归为“RAW颜色不对”。

本页解析器按这个单IFD、单条带样本读取数据,压缩DNG还需要相应的解码器。 这里可把解析结果与已知的1024个样本逐码比较;同一文件也用LibRaw作了独立读取。

贯穿算例:从存储整数回到电子刻度

同一均值流程的 1588 DN 若放入一个 16 bit 小端无符号容器,两个字节为十六进制 34 06;容器宽度不改变原来的 14 bit 有效码域。按本例标签 B=0,W=16383B=0,W=16383,线性归一化仍是 0.09693, 再乘 32,000 e⁻ 得约 3101.75 e⁻。用未舍入值计算,与未量化均值的差约 0.74 e⁻, 落在半个码格约 0.977 e⁻ 以内。

这只是本例确定性取整的往返核对,不是随机读噪的估计。上方可下载的微型 DNG 使用另一组黑白电平和样本阵列;检查那个文件时应读取其自身标签。两种练习分别 回答“同一信号怎样往返”与“真实文件结构怎样解释”。

10.3 位深、打包与有效精度

12 bit 样本可按紧密位流打包,也可装进 16 bit 字。后者每样本占两字节,却仍只有 12 bit 有效数据。反过来,传感器 ADC 可能输出 14 bit,但低若干位主要是噪声;这 不等于它们“完全没用”,随机抖动可在平均中提供亚码信息,但单样本有效精度低于 标称位深。

图 10.2 两个 12-bit 样本打包为三个字节

图 10.2 采用例10.3规定的位序:Byte 0保存A的低8位,Byte 1的高半字节来自B、 低半字节来自A,Byte 2保存B的高8位。每个字节从左到右为bit 7至bit 0。蓝色 标识A,红色标识B;其他像素格式的位序与行填充须按各自规范解释。

下面用十六进制逐位检查打包。前缀0x表示十六进制,每一位对应4 bit,称为一个 半字节(nibble);一个字节有8 bit。符号 &\mathbin{\&} 表示逐位与, ∣\mathbin{|} 表示逐位或,≪\ll、≫\gg 分别表示左移、右移。 例如 A&0xffA\mathbin{\&}\mathtt{0xff} 只留下低8位,A≫8A\gg8 则移去低8位。

例子 10.3(明确一种 12-bit 双样本打包). 规定两个无符号样本 A,BA,B 按

b0=A&0xff,b1=((B&0x0f)≪4)∣((A≫8)&0x0f),b2=(B≫4)&0xff(10.1)\begin{aligned} b_0&=A\mathbin{\&}\mathtt{0xff},\\ b_1&=((B\mathbin{\&}\mathtt{0x0f})\ll4) \mathbin{|}((A\gg8)\mathbin{\&}\mathtt{0x0f}),\\ b_2&=(B\gg4)\mathbin{\&}\mathtt{0xff} \end{aligned} \tag{10.1}

打包。若 A=0xabcA=\mathtt{0xabc}、B=0x123B=\mathtt{0x123},则 (b0,b1,b2)=(0xbc,0x3a,0x12)(b_0,b_1,b_2)=(\mathtt{0xbc},\mathtt{0x3a},\mathtt{0x12})。解包为

A=b0+28(b1&0x0f),B=(b1≫4)+24b2,(10.2)A=b_0+2^8(b_1\mathbin{\&}\mathtt{0x0f}),\qquad B=(b_1\gg4)+2^4b_2, \tag{10.2}

分别恢复 0xabc\mathtt{0xabc} 与 0x123\mathtt{0x123}。解码时须使用这里给定的 nibble 顺序;换用另一格式的顺序,像素值即使仍有规律,也会解错。

从“正文打包例子”开始,逐步查看原样本、三个字节和解码值,再选“读错 nibble 顺序”,观察字节没变而解码变了。 回到正确解码后,只丢弃4个低位,比较处理前后样本; 下方视频载荷是另一支路,改变帧率不会改这三个字节。

互动示意:两个12位样本的三字节打包与解码

互动示意:蓝色位来自样本 A,金色位来自 B。中间字节把 B 的低四位放在高半字节, 把 A 的高四位放在低半字节;解码器必须采用相同约定,才能逐码恢复原值。

播放按“原样本、存盘前处理、字节容器、解码”展开。丢弃低位的操作发生在打包前, 所以即使后面的打包完全可逆,恢复的也只是处理后的值。本例保持固定的三字节容器, 低位清零本身并没有缩短它;存储长度如何变化还取决于另行选择的编码。用错误的 半字节顺序解码则是另一种失败:字节一个没变,解释规则已经错了。页面另保留 独立位串重排对照、减黑后的有符号归一化,以及第 10.5 节的样本载荷计算。

无损压缩利用码值预测误差的统计冗余,解码后逐码相同。有损 RAW 可以使用非线性 量化、预测误差量化、空间变换或波形编码;它仍可保留较大的调色空间,却不再保证 原码恢复。

命题 10.4(无损编码保留样本可恢复性). 设编码器为 C:X→ZC:X\to Z,解码器为 D:Z→XD:Z\to X,且对每个 x∈Xx\in X 有 D(C(x))=xD(C(x))=x。则 CC 在 XX 上为单射; 任意确定性处理 F:X→YF:X\to Y 都可由码流经 F∘DF\circ D 得到与原样本相同的结果。

证明. 若 C(x1)=C(x2)C(x_1)=C(x_2),两边应用 DD 就得 x1=x2x_1=x_2,故 CC 为单射。 又有 F(D(C(x)))=F(x)F(D(C(x)))=F(x),得到第二项结论。□\square

无损压缩利用样本分布与结构中的冗余来缩短平均码长,具体某个文件也可能变长; 解码后能否逐码复原,才是这里的无损判据。

10.4 RAW 中的白平衡与后期调整

对已经正确线性化、减去黑电平且仍保留各滤色通道的马赛克 RAW,白平衡主要是 通道乘法,因此可以在解码时改变。文件若保存非线性或已融合的样本,应先按相应 契约解释。以下信息无法靠改白平衡恢复:

  • 某通道已经饱和;
  • 某通道曝光太低而埋入噪声;
  • 光谱同色异谱导致的相机响应歧义;
  • 相机在写 RAW 前已做不可逆的通道融合或强降噪。

“RAW 可任意改色温”准确含义是显影参数仍可重新选择,不是拍摄光谱和通道 SNR 可 被重写。

文件数值与显影预览

同一个RAW码可以在不同监看补偿下显得很暗或很亮。下面把电子输入、14 bit RAW、 教学Log和显示分开,复用第五、九章的单色场景;这里只考察曝光与显示,不模拟 滤色、白平衡或DNG颜色矩阵。

先选“亮窗只在监看变白”,移动探针查看窗外两处的RAW和Log码,再调低额外监看补偿。 若像素码不变而显示改变,变化来自显影支路。 然后选“亮窗在记录时合并”,核对同码为什么不能被后续显影重新区分。

互动示意:同一合成场景的捕获、记录、监看与未裁切真值对照

互动示意:三章采用相同静态输入。文件码图只展示码的大小,正确监看还需解码及 显示映射。蓝色十字在各图标出同一位置,同时列出电子均值、RAW码、Log码和降低 监看后的线性显示值。

先固定捕获与记录参数,只改额外监看补偿:RAW码和Log码都不应改变。再选择记录前 增益,把窗外枝叶和天空压到同一文件白点,观察降低监看后仍然相同的输出。 教学Log是本例附加的记录支路,不表示所有RAW都先经过Log编码;前面的微型DNG 保存的仍是声明的未压缩整数样本。

10.5 视频 RAW 的带宽与处理约束

一张 4K 图像若为 4096×21604096\times2160、每 photosite 12 bit、24 fps,未计消隐和元数据 的码率为

4096×2160×12×24≈2.55×109 bit/s,4096\times2160\times12\times24 \approx2.55\times10^9\ \mathrm{bit/s},

约 319319 MB/s,连续十分钟仅图像样本就约占 191 GB(十进制)。8K、较高帧率和 更高位深会继续增加传输与存储负担,设备因此会在全幅读出、裁切、分箱、压缩和 接口速率之间取舍;具备足够带宽的系统也可以保存未压缩 RAW。

视频 RAW 还需逐帧记录黑电平、曝光模式、白平衡建议、镜头元数据和时间码,并保证 解码吞吐。Apple ProRes RAW 把 ProRes 类压缩用于 Bayer 型单 photosite 样本,白皮书 明确区分其数据率与传统 ProRes 422/4444;这说明“ProRes”家族名不表示数据已成为 Y'CbCr 422。

不同电影 RAW 可能在去马赛克前或后压缩,可能保存传感器线性值,也可能保存厂商 定义的非线性 RAW 编码。是否能在后期改变 ISO,常表示解码器可重选曝光归一化或 元数据解释,不必表示原始模拟增益从未在拍摄时固定。

下表用“典型状态”比较几类数据契约;具体产品必须以对应版本规范为准。

数据契约采样状态响应状态压缩位置已不可逆完成的典型步骤
马赛克 DNG/CinemaDNG 帧CFA photosite常为线性或经线性化表去马赛克前拍摄模拟增益、饱和及相机预校正
ProRes RAW 类传感器样本码流单 photosite、去马赛克前编解码器定义去马赛克前拍摄读出模式、剪切及部分传感器处理
LinearRaw DNG全颜色线性样本线性去马赛克后去马赛克,且可能已有坏点/阴影校正
相机 Log RGB 视频RGB 或 Y'CbCrLog/OETF 编码去马赛克和颜色处理后去马赛克、通道混合、通常还有白平衡与降噪

所以“视频 RAW 可以后改 ISO”应拆成两问:解码曝光增益和中灰映射是否可重选;拍摄 时的模拟增益、转换增益模式、电子满阱与通道剪切是否已经固定。前者常可改,后者 不能由元数据重写。

10.6 RAW、Log 与普通视频的关系

三种称呼描述的数据状态不同:

  • RAW 保留相机相关样本和较晚的显影决定;
  • Log 通常是已经去马赛克、白平衡和颜色变换后的 RGB 视频编码,但以对数曲线保留 较大亮度范围;
  • 普通显示准备视频通常已经应用 Rec.709 类色调和锐化降噪,后期余量较少。

高质量 10/12 bit Log 在许多场景足够,并可能比低码率有损 RAW 更稳定;RAW 的优势 是重新选择显影处理的自由度。比较文件时,可以把同一帧分别解码为线性数据,统一 白平衡、输出尺寸与显示变换,再检查噪声、伪色和高光过渡。这样观察到的差异才与 具体采样和编码有关。

10.7 审读一个 RAW 规格

看到“8K 12-bit RAW”时,应继续查:

  1. 8K 是 photosite 网格、去马赛克输出还是上采样尺寸;
  2. 全画幅宽度是否裁切,是否行列跳读或像素合并;
  3. 12 bit 是线性有效位、Log 压缩位还是容器位;
  4. 压缩比是否固定,是否有损,最坏场景码率多少;
  5. 是否保留 CFA,HDR/降噪/镜头校正是否已经烘焙;
  6. 哪些软件能读,元数据和色彩管理是否公开。

这些信息共同确定样本的含义、处理余量与解码方法。

练习

练习 10.1. 14 bit RAW 的黑电平为 1024、白电平为 15,000。把样本 4500 DN 归一化到 [0,1][0,1]。

练习 10.2. 计算 3840×21603840\times2160、每 photosite 12 bit、60 fps 的未压缩 马赛克码率,分别用 Gbit/s 和 MB/s 表示。

练习 10.3. 分别给出一个“RAW 仍可后改”和一个“拍摄时已不可逆固定”的参数, 并说明物理原因。

练习 10.4. 按式 (10.1)--(10.2) 的打包约定,解包字节 (b0,b1,b2)=(0x45,0xa7,0x3c)(b_0,b_1,b_2)=(\mathtt{0x45},\mathtt{0xa7},\mathtt{0x3c}),求 12-bit 样本 A,BA,B。

本章内容