Image Format

常用图像存储格式解读

Posted by Hao on March 25, 2021

PS: This article is being continuously updated! 文章持续更新中

需要将色彩空间与图像存储格式分开,清晰列出其区别

RAW格式

.raw格式文件不带有图像的宽高等信息,只有图像像素值信息,利用opencv的接口无法直接读取,常见的程序读取包如python下的rawpy等。

raw数据是大多数相机(单板sensor)的原始图像数据,与像.bmp, .png, .jpg等格式的彩图相比,它的图像像素只有单个通道,即r,gr,gb和b中的任意一个(gr和gb可以理解为都是g通道)。因此,将raw数据转换为正常的彩图,就要补充图像像素点缺失的另外两个通道的值,对应的处理算法称为去马赛克(demosaic)或者插值(Bayer Color Filter Array, CFA)

其中bayer CFA是raw格式比较常用的一种。

opencv中的接口cvCvtColor帮我们做了从raw到rgb的转换。接下来的问题是,只要利用别的方法正确读取raw数据即可。目前我碰到的raw数据文件,文件未存储图像格式相关信息(比如宽和高),像素值内容以二进制文件形式存储,每个像素值存储空间为2个字节。

每个像元对应一个字节,一个unsigned char就是0xFF,最大255。

常用的raw格式名包括.dng,.tiff等,DNG格式是在TIFF的基础上扩展出来的,要了解DNG,需要清楚TIFF, TIFF/EP, DNG,RAW之间的关系。

  • TIFF:是一个灵活适应性强的文件格式。通过在文件标头中使用”标签”,它能够在一个文件中处理多幅图像和数据。标签能够标明图像的如图像大小这样的基本几何尺寸,或者定义图像数据是如何排列的,或者是否使用了各种各样的图像压缩选项。

  • CR2:CR2 file is a RAW digital photography file format which was developed by Canon. This file format stores lossless details from the camera sensor without any processing of the image. Unlike other processed image formats like Jpeg which only records 8 bits of RGB, CR2 records up to 14 bits of RGB. The lossless feature of this image format makes it ideal for storing image’s originality and a lot of post processing can be done later. Canon’s been using this format since their 350D, 20D, 1D MarkII camera models. For that it’s one of the most common RAW image formats available and that’s why it was included in AfterShot Pro.

  • MIPI raw格式,是为了解决raw10、raw12、raw14的图像数据存储的紧密存储格式。例如raw10, 同故宫5个byte存储4个像素,有一个byte是4个pixel共享的。

EXIF - 图片元信息

可交换图像文件格式(英語:Exchangeable image file format,官方簡稱Exif),是专门为数码相机的照片设定的文件格式,可以记录数码照片的属性信息和拍摄数据。Exif是一种图像文件格式,实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及GPS全球定位系统数据、缩略图等。你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息。

markernote

厂商注释(MakerNote)是储存在 Exif 中的厂商专有的注释数据,采用二进制格式,由不同的厂商自行制订,因此没有统一的标准,往往只能由生产商读取。厂商注释往往记录了许多 Exif 标准中未被正式定义的标签,比如快门次数、白平衡微调、人脸侦测信息、连拍序列、对焦数据等等,大大扩展了 Exif 标准的局限性。由于缺乏统一的行业标准,加之设备生产商往往不对外公布其厂商注释采用的格式,使得解码和识别厂商注释变得十分困难。一般的 Exif 查看软件并不能解码厂商注释数据,目前能够正确读取并识别的厂商注释项目的Exif 查看/编辑软件比较少,主要有:ExifTool、MagicEXIF(中文支持)、bkviewer、JPEGsnoop(仅限佳能和尼康)等。

色彩模式

CIE 1931 RGB 和 CIE 1931 XYZ,这两个色彩空间包含了所有人类可以感知的色彩。通过色匹配函数(Color Matching Function, CMF),可以将任何一种物理上的光谱分布,转换到线性色彩空间中。CIE RGB 和 CIE XYZ 两者其实是同一个线性空间的不同表达,因此两者的转换可以通过转换矩阵实现。

自然界本身是没有「颜色」这个属性的,只有对不同波长光线的反射率/透过率,到达人眼中的,显然是一个连续的光谱分布函数。数学上,这是一个无穷维的函数空间(巴拿赫空间)。而人眼内的三种视锥细胞,它们的感光特性曲线相当于是在这个无穷维的函数空间中建立了三个基底。任何一个光谱分布进来,三种视锥细胞被激发。由于色视觉响应的线性性,这一过程相当于光谱分布函数与三个基底做内积,或者说,「投影」到这三个基底上。

人类的色视觉,是相当于在自然界所有颜色的无穷维函数空间中取了一个三维的投影。这个三维空间的基底,既可以是视锥细胞的感光特性曲线(我们的大脑就用的是这套),当然也可以是选取三种颜色的光进行组合(CIE RGB 空间),甚至还可以是用实际中不存在的「光线」进行组合 (CIE XYZ 空间)。

CIE RGB 色彩空间和 CIE XYZ 色彩空间是完全等价的,两者只是差了一个线性变换。由于允许「减法」的存在,因此 CIE RGB 空间是能够表示所有颜色的;同样的,CIE XYZ 空间也能。使用RGB和XYZ的色彩空间用于表示其余波长的光如图所示。

RGB_Color_Space

XYZ_Color_Space

XYZ 颜色空间

CIE 1931 XYZ色彩空间(也叫做CIE 1931色彩空间)是其中一个最先采用数学方式来定义的色彩空间,它由国际照明委员会(CIE)于1931年创立,在RGB系统基础上,改用三个假想的原色X、Y、 Z建立了一个新的色度系统。将它匹配等能光谱的三刺激值。XYZ色彩空间,将RGB色彩空间的基准做了线性变换,解决了数值的非负问题,并使Y能表示亮度信息。

LMS – cone response color space defined by Bradford transformation

LMS(长、中、短)是一种颜色空间,它代表了人眼三种视锥细胞的响应,以它们在长、中、短波长的响应度(灵敏度)峰值命名。大部分人类的视网膜上有三种感知颜色的感光细胞,叫做视锥细胞,分别对不同波长的光线敏感,称为 L/M/S 型细胞。三种视锥细胞最敏感的波长分别是橙红色(长波,Long),绿色(中波,Medium),蓝色(短波,Short)。

数值范围一般不指定,除了下限一般以零为界。 在执行色度适应(估计样本在不同光源下的外观)时,通常使用 LMS 色彩空间。 当一种或多种锥体类型有缺陷时,它也可用于研究色盲。

CIE Lab 与 CIE LUV

更多的科学家研究了人类对色彩的分辨能力,逐渐建立了一些理论基础。人们希望通过一些非线性变换,找到一个「感知均匀性」更好的色彩空间,或者,从微分几何的观点来看,找到一个更为「平坦」的映射关系。比较常用的有 CIE Lab,CIE Luv,等

RGB格式 - 对应编码格式

RGB 格式有 RGB565,RGB24, ARGB32 等几种标准。大家都知道,在数据传输中,一个字节是 8 个比特。 RGB565:共 16 比特, 占两个字节。 其中 5 个比特表示 R,6 个比特表示 G,剩下来 5 个比特表示 B,所以一共可以表 示的颜色数为 2^16 = 65536 色, 其中红色 R 和蓝色 B 可表示为 32 种不同值,而绿色 G 可以表示 为 64 种不同值; RGB24: 共 24 比特,占三个字节。 其中 RGB 三种颜色各种 8 个比特位, 所 以一共可以表示的颜色数为 2^24 = 1677 万色,每种颜色可表示成 256 种不同值; ARGB32:共32 比特,占四个字节。 其中 RGB 三种颜色各占 8 比特,剩下来 8 比特表示 Alpha 通道值, 所以一共可以表示的颜色数为 2^24 = 1677 万色,每种颜色可表示成 256 种不同值。但是因为加了 Alpha 值,所以每种颜色还可以另外显示为 256 种不同的透明度。

Rgb48 - rgb161616

Rgb48 is a sRGB format with 48 bits per pixel (BPP). Each color channel (red, green, and blue) is allocated 16 bits per pixel (BPP). This format has a gamma of 1.0.

PNG格式

PNG,全称Portable Network Graphic Format,可移植网络图形格式。是一个unisys公司提出的,为了是替代古老的gif格式。

  • PNG文件采用LZ77算法的派生算法进行压缩,其结果是获得高的压缩比,不损失数据。它利用特殊的编码方法标记重复出现的数据,因而对图像的颜色没有影响,也不可能产生颜色的损失,这样就可以重复保存而不降低图像质量。
  • PNG可以为原图像定义256个透明层次,使得彩色图像的边缘能与任何背景平滑地融合,从而彻底地消除锯齿边缘。这种功能是GIF和JPEG没有的,即alpha信道
  • PNG支持渐进网络传输显示,PNG图像在浏览器上采用流式浏览,即图像会在完全下载之前提供浏览者一个基本的图像内容,然后再逐渐清晰起来。它允许连续读出和写入图像数据,这个特性很适合于在通信过程中显示和生成图像。

JPG格式

JPEG是joint Photographic Experts Group(联合图像专家组)的缩写,文件后辍名为”.jpg”或”.jpeg”。

JPEG压缩

JPEG压缩是一种有损压缩,通过DCT(离散余弦变换)实现。JPEG的压缩比例大,最终的生成文件小,常用于网络图像的传输。通常JPEG的压缩流程如下:

JPEF_Compression

核心思想是将图像分成若干个子块,对每一个子块进行处理。原始图像经过FDCT变换后,获得临时结果,通过对临时结果进行亮度表量化(乘量化系数矩阵)后,获取量化结果。所得到的结果绝大多数的值均为1,通过将矩阵进行游程编码(ZIG-ZAG排序),使其获得到更多的连续的0的个数,从而缩小数据量。而图像的解码过程则为,将原始的游程编码根据量化表恢复临时数据,通过IDCT来获取标准化后的值,最终复原获得原始图像。

JPEG2000

JPEG2000,这个版本支持有损和无损压缩,并且能实现渐进传输,即先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图像由朦胧到清晰显示。

BMP格式

HEIF格式 (High Efficiency Image File Format, HEIF,也称高效图像文件格式)

HEIF全称是High Efficiency Image File Format(高效图像文件格式),一种高效的图片封装格式,通常的文件后缀名为HEIC。不同于我们最常见到的JPEG格式图片,HEIF是一种封装格式,一般HEIF格式的图片,特指以HEVC(H.265)编码器进行压缩的图像文件。也是一个用于单张图像或图像序列的文件格式。它由动态影像专家小组(MPEG)开发,并在MPEG-H Part 12(ISO/IEC 23008-12)中定义。

采用更先进、高效的HEVC编码方式,在相同的一张图片上,HEIF格式可以将照片的大小压缩到JPEG格式的50%左右,而在同一部手机上,就可以存储相比以前多2倍的照片数量。小米10得益于高通骁龙™865移动平台的Qualcomm® Spectra™ 480 ISP,保留了对HEIF照片以及HEVC视频拍摄的功能支持,让小米10的一亿像素照片拥有更多细节的同时,而不必担心存储大小的问题。

由于封装格式与编码方式的相互独立,赋予了HEIF格式更多的功能特性。以往,我们可以通过在JPEG格式图片上附加EXIF信息,来存储照片的拍摄地点、设备参数等数据。而HEIF格式不仅可以存储静态图像、EXIF、景深信息、透明通道等图片信息,还可以存储动画甚至视频、音频等等,这就带来了更多的可玩性。

  1. 可后期的景深和焦距

当你在使用HEIF格式拍摄的时候,可以同时存储照片以及智能手机收集计算到的景深信息,这样在图片编辑界面就可以实时调节照片景深的深浅,提升你的成片量。同理,得益于图形处理能力强大的Spectra ISP,配合HEIF格式的封装,还可以在一次快门后瞬时存储多张不同焦距下的照片(取决于镜头数量),大大增加了照片的选择性和拍摄容错率。

  1. 动态照片

HEIF格式支持的HEVC编码又叫H.265编码标准,是一种先进的视频编码标准,也正因为如此,使用HEVC编码的HEIF格式,可以轻松高效的实现动态照片的拍摄和存储。在你按下快门的那一刻,自动记录前后几秒钟的视频和音频,并存储在一个HEIF格式的图片上,让照片不只是定格在某一个瞬间。同样还有对动图的支持,我们常见的GIF动图不仅色彩较少,只有256种颜色,并且相对体积也很臃肿。而采用HEVC编码的HEIF格式在存储动图上,不管是画质还是体积都有巨大的优势。

  1. 更高要求的画质

JPEG格式图片的色深只有8bit,而HEIF格式拥有最高16bit的色深,两者之间有着指数级别的差距,显然HEIF格式的图片能够提供更多、更好的色彩以及还原度,配合对HDR、色深等信息的封装,让HEIF格式记录和显示更鲜艳明亮、更鲜活生动的照片和视频。

骁龙对HEIF的支持

在骁龙855移动平台上,内置了全球首个计算机视觉图像信号处理器(CV-ISP)Spectra™ 380,CV-ISP提供了计算机视觉对象分类和分割,可以精准地对选定的对象或背景进行实时替换,并且还支持HDR10+ 4K视频的拍摄,能够捕捉超过10亿色,带来丰富的细节和色彩信息。为了保留CV-ISP记录的丰富计算机视觉信息,骁龙855引入了对HEIF格式的支持,Spectra 380 CV-ISP内置了首款面向拍摄和播放的HEIF加速器,辅助用户更好的进行拍摄创作。

与jpeg相比的根本区别在哪里?

传统的JPG格式图片的特点,JPG包含了压缩编码和容器,而HEIF格式则是将容器和编码方式分开,只记录编码,容器则交由硬件去硬解,这样一来,HEIF格式占用的储存空间就变小了,相比JPG格式,使用HEIF格式的图片,在保证图像质量的前提下,照片文件体积减小了50%。当然,也需要更多的计算机算力进行解码。

相比JPG格式只能存储静态图像和EXIF等信息,HEIF格式更进一步,除了静态图像和EXIF外,还能存储景深、透明通道等信息,甚至还可以存储视频、音频等等,由此带来了更加丰富的后期空间。例如可以后期手动调节照片景深的变化,提升照片的成片率;利用按下快门的瞬间手机自动记录前后几秒钟的视频和音频,后期可以挑选最好的那一刻,或者制作动图,并且HEIF格式在存储动图上不管是画质还是体积都有巨大的优势。

GIF格式

图像互换格式(英語:Graphics Interchange Format)是一种位图图形文件格式,以8位色(即256种颜色)重现真彩色的图像。它实际上是一种压缩文档,采用LZW压缩算法进行编码,有效地减少了图像文件在网络上传输的时间。它是目前全球資訊網广泛应用的网络传输图像格式之一。 它采用无损压缩技术,只要图像不多于256色,则可既减少文件的大小,又保持成像的质量。现在我们一般所说的GIF动画都是指89a的格式。

GIF格式普遍适用于图表,按钮等等只需少量颜色的图像(如黑白照片)。

YUV色彩空间

YUV是一种颜色空间,基于YUV的颜色编码是流媒体的常用编码方式。Y表示流明,U、V表示色度、浓度,这种表达方式起初是为了彩色电视与黑白电视之间的信号兼容。 对于图像每一点,Y确定其亮度,UV确认其彩度。

YUV格式与YCbCr格式的异同

YCbCr常用来描述影像信号,是数字信号;YUV通常用来描述模拟信号

YCbCr或Y’CbCr是YUV经过缩放和偏移的翻版。

其中:

  • Y’为颜色的亮度(luma)成份
  • Cb为蓝色浓度偏移量成份
  • Cr为红色浓度偏移量成份

Y’和Y是不同的,使用了伽马修正(gamma correction)编码处理。

  • Y 表示灰度信息(luminance)—或者说是亮度的感知信息
  • Y’ 表示亮度(Luma)信息—或者说是电子化的亮度信息(和显示系统的硬件信号,比如电压直接相关)

Y’CbCr用于数字图像领域,YUV用于模拟信号领域,MPEG、DVD、摄像机中常说的YUV其实是Y’CbCr,二者转换为RGBA的转换矩阵是不同的。

YUV与RGB的转换计算

YUV_RGB_Conversion 注意在上面的式子中,RGB 的范围是 [0,255],Y 的范围是 [16,235] ,UV 的范围是 [16,239]。 如果计算结果超出这个范围就截断处理。 YUV_RGB_Conversion2

总结:RGB到YUV的公式变换有多种,取决于RGB和Y、Cr及Cb的取值范围。RGB 到 YUV 的转换公式变化很小,只是VU 的值做了个平移。其中,Y取亮度分量,近似于灰度值的计算;Cr主要为R分量,减掉一定系数下的G和B分量;Cb主要是B分量,减掉一定系数的R和G分量。

YUV图像中的Stride及Plane

YUV_Stride 在YUV图像中,Stride是指内存中每行像素所占空间,如上图所示。每行像素在内存中所占的空间并不是图像的宽度,例如10bit图像的stride通常为图像宽度的两倍,某些图像为了保证能够被NEON或Hexagon等加速模块处理,需要保证其图像长宽能被16位整除等。在对应的图像处理算法中,通常定义为px与py,及表示图像在两个方向padding的数量,使得在算法处理时只对有实际意义的区域进行处理。

Plane通常意义上是指颜色信道(Channel)。

YUV在图像中的存储形式

YUV_8bit

(YUV420-SP)NV21, NV12 YUV422, YUV444

YUV格式:有两大类:planar和packed。

YUV格式通常有两大类:打包(packed)格式和平面(planar)格式。

对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。

对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。

YUV_10bit

YUV420_10bit

YUV420_10bit为现阶段高端手机的通用存储图像格式,包括YUV420_10bit_uvYUV420_10bit_vu等,根据图像中色彩信道的存储顺序不同,其命名形式不同。其在16位的存储中,表现为LSB (Least Significant Bits),即最低位有效的形式,每个像素的值占据两个字节的后10位。

P010

P010的图像存储格式与YUV420_10bit_uv相同,只是每个像素值的存储为MSB (Most Significant Bits),即最高位有效形式。可以通过YUV420_10bit_uv格式图像的每个像素值左移6位来实现。

模拟信号与数字信号

模拟信号是指用连续变化的物理量所表达的信息,如温度、湿度、压力、长度、电流、电压等等,我们通常又把模拟信号称为连续信号,它在一定的时间范围内可以有无限多个不同的取值。而数字信号是指在取值上是离散的、不连续的信号。

模拟视频信号每帧的图像信息是连续获取的,用连续的电信号表示;数字视频信号则是通过一定速率的模数转换器(A/D)取样、量化、编码,将模拟信号转换成数字信号,当然如今的摄像机等视频获取设备也基本实现了数字化,可以直接形成数字视频。想要不转换格式处理模拟视频,就需要专门的设备,而数字视频信号可以很方便地在普通的PC里做进一步的处理,根据不同的数据压缩编码方案,形成不同格式的数据流,满足不同设备和观众的需求。

模拟视频的还原性好,早期成本也更低,但它的最大缺点是不论被记录的图像信号有多好,经过长时间的存放或经过多次复制之后,画面的失真就会很明显,而且在传输中也容易受到干扰,难以满足高分辨率显示的需求(并非不可能,使用模拟信号进行高分辨率显示需要使用昂贵的线材和设备)。数字视频也许并不能算是完全还原实际图像,但可以不失真的进行无数次复制、便于长时间存放、编辑、传输,可以满足高分辨率显示的需求。

模拟视频是指由连续的模拟信号组成的视频图像,以前所接触的电影、电视都是模拟信号,之所以将它们称为模拟信号,是因为它们模拟了表示声音、图像信息的物理量。摄像机是获取视频信号的来源,早期的摄像机以电子管作为光电转换器件,把外界的光信号转换为电信号。摄像机前的被拍摄物体的不同亮度对应于不同的亮度值,摄像机电子管中的电流会发生相应的变化。模拟信号就是利用这种电流的变化来表示或者模拟所拍摄的图像,记录下它们的光学特征,然后通过调制和解调,将信号传输给接收机,通过电子枪显示在荧光屏上,还原成原来的光学图像。这就是电视广播的基本原理和过程。模拟信号的波形模拟着信息的变化,其特点是幅度连续(连续的含义是在某一取值范围内可以取无限多个数值)。其信号波形在时间上也是连续的,因此它又是连续信号。

Reference