跳转至

一、术语

图片格式是计算机存储图片的格式,常见的存储格式有 bmp、jpg、psd、raw、yuv、HEIF 等。

像素深度是指存储每个像素所用的位数,也用它来度量图像的分辨率。像素深度决定彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数。来源

色彩空间(Color space)是对色彩的组织方式。借助色彩空间和针对物理设备的测试,可以得到色彩的固定模拟和数字表示。来源

六大颜色空间 - 知乎:相机涉及到的主要为 RGB 和 YUV 颜色空间,其中 RAW 图使用的是 RGB 颜色空间。

像素深度是指存储每个像素所需要的比特数。假定存储每个像素需要 8bit,则图像的像素深度为 8。

图像深度是指像素深度中实际用于存储图像的灰度或色彩所需要的比特位数。假定图像的像素深度为 16bit,但用于表示图像的灰度或色彩的位数只有 15 位,则图像的图像深度为 15。图像深度决定了图像的每个像素可能的颜色数,或可能的灰度级数。例如,彩色图像每个像素用 R、G、B 三个分量表示,每个分量用 8 位,像素深度为 24 位。

二、图片查看

exiftool 是看 dng、jpeg 图片详情的工具,安装:sudo apt-get install libimage-exiftool-perl

File Viewer Plus 4:一个付费的专业看图工具。

三、RAW格式

3.1 颜色与布局

RAW 格式不包含色彩,因为 RAW 阶段还没有需要讨论色彩的阶段。RAW 文件本身包含的是 RGB 的灰度数据,只有经过 ACR 或其他解 RAW 软件的导入和用户的确认,导入以后的 RAW 才是导入过程中在指定色彩空间中的“颜色”。[1]

在硬件层面,颜色需要通过一个具有滤镜(filter)的单元来直接或间接地获取。这些单元组成 color filter array (CFA),根据排列方式可分为:(classic) Bayer、quad Bayer。

估计由于这样有规律且花花绿绿的排列,故称为 Bayer filter mosaic。过滤器图案是 1/2 绿、1/4 红和 1/4 蓝,因此也称为 BGGR、RGBG、GRBG 或 RGGB。[5]

Quad Bayer 也被三星称为 Tetracell,被 OmniVision 称为 4-cell,相比于 (classic) Bayer 具有如下特点:

  1. 厂家可声称更大的像素。虽然由于噪声和衍射,相比于同尺寸的 sensor,清晰度(sharpness)的提升是有限的。
  2. 调节灵活,暗光下可合并像素,亮光下正常使用,高动态范围下可同时拍多张照片。(理论上是这样,但实际相机不一定会自动处理)

For darker scenes, signal processing can combine data from each 2x2 group, essentially like a larger pixel. For brighter scenes, signal processing can convert the Quad Bayer into a conventional Bayer filter to achieve higher resolution.

3.2 处理流程

相机软件的处理流程包括:[2]

  1. 相机 rawRGB
  2. 黑电平减法和线性化 + 缺陷像素遮罩
  3. 镜头矫正、不均匀的增益
  4. 去马赛克降噪(demosaic)
  5. 白平衡、色彩空间转换(CIE XYZ / ProPhoto)
  6. 色相饱和度调整
  7. 曝光补偿
  8. 色彩渲染
  9. sRGB 转换
  10. sRGB 伽马变换

图片格式_isp处理流程.png

对于拜耳排列的传感器,去马赛克的过程就是线性插值的过程。其中,R\B 使用邻域平均方法,而 G 使用分段函数平均方法。[3]

图片格式_去马赛克插值.png

\[ G(R)=\begin{cases} \frac{G_1+G_3}{2} & ,|R_1-R_3| < |R_2-R_4| \\ \frac{G_3+G_4}{2} & ,|R_1-R_3| > |R_2-R_4| \\ \frac{G_1 + G_2 + G_3 + G_4}{4} & ,|R_1-R_3| = |R_2-R_4| \end{cases}. \]

3.3 Quad Bayer 与 sensorMode

由于主摄一般出 Quad Bayer 排列,这种排列无法通过 ISP 处理,因此需要将 4 个像素合并为 1 个像素,这个处理的模式称为 binning mode

另外,若要让主摄输出高像素图片,则需将 Quad Bayer 排列重排列为 (classic) Bayer 排列,这样的处理称为 remosaic,这样的处理模式称为 fullsize mode。这个 remosaic 分为两种方式:软件 remosaic 和硬件 remosaic 算法。

3.4 格式与存储

为了节省空间,图像从 mipi 输出到存储为 RAW 需要一定的位域转换。

根据像素深度的不同,RAW 格式可分为 RAW10、RAW16 等。例如,L11 专业模式的 RAW 选项拍照时,底层输出就是 RAW16,即每个像素由两个字节存储。

除了像素深度,还有:

The raw file contains the image data as the camera recorded it. Each camera make uses their own version and will store the raw data in slightly different ways. For example Canon cameras have used 'CRW', 'CR2' and even 'TIF' as raw formats. [4]

3.5 为什么是RGBG排列

  • 拜耳固定 2G+1R+1B:适配人眼绿光高灵敏度,用 G 通道承载亮度与对焦测光,是画质与硬件成本最优解;
  • 选用 RGB 三原色而非其他色片:加法色彩适配光电传感器解码,计算简单;
  • 多色 / RGBW 特殊阵列因为色彩插值缺陷,无法替代标准拜耳成为消费级、专业相机主流。
  • 华为 RYYB 阵列:用黄色滤光片替代部分绿色,提升进光,但黄色是混色通道,色彩插值偏黄严重,白平衡校准困难,风光、人像肤色翻车,后期几乎不可救药;

  • 老式 CYGM 减法色彩阵列:色彩解码矩阵复杂,色彩饱和度控制困难,早期数码时代直接被拜耳淘汰。

  • 其他方案如果没有明显优势的话,考虑ISP等后续算法的兼容性问题,就没必要换了。

3.6 参考链接

  1. raw 格式本身有色彩吗? - 知乎
  2. RGB、YUV 和 HSV 颜色空间模型 - cnblogs
  3. ISP 之 Bayer Raw 简介 - CSDN
  4. Camera Raw File Format
  5. Bayer filter - Wikipedia
  6. quad_bayer_sensors_explained

四、YUV

4.1 颜色空间

YUV 颜色空间家族 - CSDN:Y 亮度(luminance),UV 为色度(chrominance),U 蓝色色度分量,V 红色色度分量。

图片格式_yuv颜色空间.png

图片格式_yuv色彩模型.png

图引自:来源来源

4.2 编码

4.2.1 部分采样

图片格式_色度部分采样.png

如 420:每 4 个 Y 采样点,奇数行有 2 组 UV 采样点,偶数行有 0 组 UV 采样点。来源

图片中不研究的就是,各个格式并没有说出 U 和 V 具体是怎么采样的,详见来源

4.2.2 压缩比

YUV 根据采样方式的不同,其占用大小也不一样,主流有如下三种:

YUV444 两行每行都有 4 个 Y、每行都采 4 个 U/V,色度和亮度分辨率完全一致,无色度压缩。 每一个 Y 对应一组 UV 分量,即:一个 YUV 占 8+8+8 = 24bits,3 个字节。

YUV422 第一行 2 个 Y 取 UV,第二行同样 2 个 Y 也取 UV,两行都有色度采样,因此第三数字是 2。 每两个 Y 共用一组 UV 分量,即:一个 YUV 占 8+4+4 = 16bits,2 个字节。

YUV420 上行 2Y 取 UV,下行直接复用上行 UV,下行无独立色度采样 → 第三位 = 0。 每四个 Y 共用一组 UV 分量,即:一个 YUV 占 8+2+2 = 12bits,1.5 个字节。

确定压缩比后,可以方便地为 YUV 设置存储的宽(bufWidth)。来源

4.2.3 YUV420存储

现在考虑 YUV 具体的存储分布:

YUV Formats 分成两个格式:来源

紧缩格式(packed formats)(two-plane):将 Y、U、V 值存储成 Macro Pixels 数组,和 RGB 的存放方式类似。紧缩格式(packed format)中的 YUV 是混合在一起的,对于 YUV4:2:2 格式而言,用紧缩格式很合适,因此就有了 UYVY、YUYV 等。

平面格式(planar formats)(three-plane):将 Y、U、V 的三个分量分别存放在不同的矩阵中。平面格式(planar formats)是指每 Y 分量,U 分量和 V 分量都是以独立的平面组织的,也就是说所有的 U 分量必须在 Y 分量后面,而 V 分量在所有的 U 分量后面,此一格式适用于采样(subsample)。平面格式(planar format)有 I420(4:2:0)、YV12、IYUV 等。

YUV 420P 和 YUV 420SP 都是基于 Planar 平面模式进行存储的,先存储所有的 Y 分量后,YUV420P 类型就会先存储所有的 U 分量或者 V 分量,而 YUV420SP 则是按照 UV 或者 VU 的交替顺序进行存储。来源

注: P表示平面式存储,SP = Semi-Planar(半平面、准平面)。

格式 存储结构 通道排列 类型
YU12(I420) 三平面 Planar Y U V 420P
YV12 三平面 Planar Y V U 420P
NV12 双平面 Semi-Planar Y + UVUV… 420SP
NV21 双平面 Semi-Planar Y + VUVU… 420SP
格式 采样格式 编号逻辑 色度排列
NV12 YUV420 1=UV、2=12bit UVUV
NV21 YUV420 2=VU、1=12bit VUVU
NV16 YUV422 1=UV、6=16bit UVUV
NV61 YUV422 6=VU、1=16bit VUVU
NV24 YUV444 1=UV、4=24bit UVUV
NV42 YUV444 4=VU、2=24bit VUVU

注: NV = Non-packed Video(非打包半平面格式);12 = 每像素平均占用 12 bit(假设像素深度默认为8bit)存储空间;21表示倒序,不是正序的UV,而是倒序的VU。

所以下图很容易看出是 YU12 格式。

图片格式_yu12格式.png

YUV4ab:基于 2x4 的亮度点区域中,计算出了 a+b 个色度点,第一行有 a 个色度点,第二行有 b 个像素点。称为 4:a:b 类型。该类型只对亮度和色度的采样关系进行了说明,但未对存储顺序进行说明。

4.2.4 YUV422存储

4.3 stride & slice

可能由于硬件特性或效率考虑,如字节对齐等,获取的图片会多一些无用的信息,无用的信息用 stride 和 slice 指示。宽(width)和高(height)的单位是像素,stride 的单位是字节(stride × slice 就等于平面的实际存储大小)。来源

图片格式_stride与slice.png

注意计算图片字节时:StridesInBytes * imgHeightInPixels

4.4 格式选择

根据画质需求选择取舍: 4:4:4:无损色彩,后期调色、CG 合成、电影母带,无色度压缩,体积最大; 4:2:2:广电摄像机 SDI 输出、演播室信号,色彩足够,兼顾画质与带宽; 4:2:0:消费级视频、手机、监控、流媒体、MP4,极致压缩,民用绝对主力; 4:1:1:老旧 VCD、早期流媒体,压缩拉满,色彩糊。 采样比例决定带宽上限。

不同算法需求选择不同的格式:

图像格式 主打算法类型 典型落地位置
RGGB RAW 传感器校正、去拜耳、原生曝光对焦 相机 ISP 最前端
YUV (SP 或 P形式存储) 光影增强、降噪锐化、视频编码、运动检测、通用目标检测 相机预览、视频链路、边缘算力推理
RGB 专业调色、3D-LUT、色彩 AI 识别、画面显示出图 后期工作站、屏幕终端、高精度视觉设备

五、存储格式

5.1 JPEG

jpeg is a blob format.

JPEG(Joint Photographic Experts Group),一种图像格式。A JPEG image is represented as a sequence of segments(字段)where each segment begins with a marker(段标记)。Each marker starts with 0xFF byte followed by marker flag to represent the type of marker. The payload followed by marker is different as per marker type.

JPEG 应用字段信息见:来源来源来源

JPEG 格式解析工具:JPEGsnoop

JPEG 压缩步骤:来源

一个 jpeg 例子:来源

图片格式_jpeg结构示例.png

5.2 EXIF

当 Exif 用于 JPEG 文件时,Exif 数据存储在 JPEG 定义的实用程序应用程序段之一 APP1(段标记 0xFFE1)中,APP1 实际上在其中保存整个 TIFF 文件。来源

图片格式_exif结构.png

Exif 使用 TIFF 格式来存储数据,TIFF 格式请参考官方文档来源

图片格式_tiff结构.png

  • APP1 Marker:FFE1
  • Exif Header:45786966 就是 exif 的 ascii 码。
  • TIFF Header:4949ll(intel)的 ascii 码,表示数据为小端模式。常量 0x002A 小端模式为 2A00。TIFF Header 首地址到 IFD0 首地址的字节数为:0x00000008
  • IFD(Image file directory)由各子项组成。Exif 相关 tagId 的说明详见推荐来源来源
  • Dir Length:Number of directory entry
  • 数据存储:
    • 用于数据存储的只有最后的 4 字节,无法存储过长的字符串或总长度超过 4 字节的数据信息。所以对于总长度超过 4 字节的信息,实际存储在 IFD 的 Data area 中,在 Directory Entry 的最后四个字节中存储该信息的偏移地址。
    • Ascii 存储(2):大致是,从文件开始算偏移 0,NNNNNNNN+DDDDDDDD 存储对应字符串。不满 8 个字节时,从后面填充。
    • u16 存储(4):即 DDDDDDDD

重要 tag:

  • ExifOffset:EXIF subIFD 的偏移量,貌似是基于 Exif Header 开始偏移。主要存储 sensor 应用的相关参数。
  • ResolutionUnit、XResolution:设定一个图片的原图大小,即设定每英寸的像素个数,从而实现最佳看图体验,亦即打印尺寸。

图片格式_exif标签.png

JPEG 中 EXIF 信息解码网站 exif-viewer:该网站不会对参数进行归一化或约分运算,参数名为英文,容易与代码对应。

连拍例子

echo " -createdate -aperture -shutterspeed -iso " > check.log && for i in {1..10}; do exiftool -T -createdate -aperture -shutterspeed -iso IMG_20220510_155027_TIMEBURST${i}.jpg >> check.log; done

5.3 HEIF/HEIC格式

更高效照片格式,节省存储空间,不支持动态照片、去水印和部分第三方应用。

Exif 文件格式与 JPEG 文件格式相同。Exif 按照 JPEG 的规格在 JPEG 中插入一些图像/数字相机的信息数据以及缩略图像。来源

HEIF 和 HEIC 的区别

There is a difference between HEIF and HEIC. And it is that HEIF is a file format for storing individual images and sequences of the image. On the other hand, the HEIC file can store both image and video files that is how Lice Photos of iOS devices work. And HEIC is a container that holds the HEIF images. That's the only main difference between HEIC and HEIF file format. 来源

六、Blob

Blob 是“云端文件”。应用使用 blob 读取和写入数据的方式与在磁盘上的文件大致相同。但与本地文件不同的是,可以通过 Internet 连接从任意位置访问 Blob。来源

Azure Blob 存储是非结构化的,这意味着它可保存各种类型的数据。例如,blob 可以保存 PDF 文档、JPG 图像、JSON 文件和视频内容等等。Blob 并不限于常见的文件格式;Blob 可能包含从科学仪器流式传输的千兆字节二进制数据、另一个应用程序的加密消息,或者正在开发的应用的自定义格式的数据。

七、DNG

DNG(Digital Negative,数字底片)是 Adobe 开发的一种开放的 raw image file format,主要是为了统一不同厂商 raw 格式。DNG 的另一好处是在资源管理器里可以直接预览缩略图。

DNG 格式是 TIFF6.0 的扩展,里面使用的 tag 基本上都定义在 TIFF 或者 TIFF/EP 中,在 DNG Specification 中只是定义或者建议了数据的组织方式、颜色空间的转换等等。

APP 收到 RAW 图后,通过 Adobe 的 dng_sdk 将 bayer raw 转为 dng 格式。

7.1 PNG

来源

PNG 文件使用 Big-Endian 顺序存储数据。

结构分类

  1. 署名域:89 50 4e 47 0d 0a 1a 0a
  2. 数据块(Chunk):3 个以上
  3. 关键数据块
    1. 文件头数据块 IHDR(header chunk):它包含有 PNG 文件中存储的图像数据的基本信息,并要作为第一个数据块出现在 PNG 数据流中,而且一个 PNG 数据流中只能有一个文件头数据块。
    2. 调色板数据块 PLTE(palette chunk):包含有与索引彩色图像(indexed-color image)相关的彩色变换数据。真彩色图像和带 α 通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。
    3. 图像数据块 IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
    4. 图像结束数据 IEND(image trailer chunk):它用来标记 PNG 文件或者数据流已经结束,并且必须要放在文件的尾部
  4. 辅助数据块(可选)

数据块结构

名称 字节数 说明
Length(长度) 4 指定数据块中数据域的长度,其长度不超过 (2^31-1) 字节
Chunk Type Code(数据块类型码) 4 由 ASCII 字母组成
Chunk Data(数据块数据) 可变长度 存储按照 Chunk Type Code 指定的数据
CRC(循环冗余检测) 4 存储用来检测是否有错误的循环冗余码

IHDR 格式来源:Length == 0D,Chunk Type Code = 49 48 44 52

域的名称 字节数 说明
Width 4 列数
Height 4 行数
Bit Depth 1 图像深度,彩图中每个通道单独计算
Color Type 1 灰度图(0);真彩色(2);索引彩色(3);带 α 通道数据的灰度图(4);α 通道数据的真彩色(6)
Compression method 1 压缩方法
Filter method 1 滤波器方法
Interlace method 1 隔行扫描方法

八、颜色空间

bpp:Bits Per Pixel

8.1 YUV

mtkcam-halif/def/ImageFormat.h

BT.709、Rec.709、ITU.709 为一个标准,它的全称为 ITU-R Recommendation BT.709。Rec.709 也是 SDR(Standard Dynamic Range,标准动态范围)所使用的标准。来源

图片格式_bt709标准.png

来源

Here is a little script which converts full-range 0 - 255 video to limited-range 16 - 235.(For BT709)

YUV 和 RGB 间的转换 - CSDN:由于颜色空间的不同,转换矩阵参数亦有所不同。

ITU-R 709-6:标准设置显示需要的各种参数,与颜色空间有关的为转换矩阵参数、量化电平和编码。