三维实景可视化室内定位导航技术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 图像的基本概念

2.1 图像与视频

图像是对自然世界的一种客观反映。人们对图像最直观的理解是人眼所见或照相机所拍的图像。视频是由一系列与时间、空间相关的图像信息构成的集合。根据视觉暂留原理,人眼有一个动态视觉阈值,当图像之间进行连续切换的时间间隔小于这个阈值时,人眼观察到的是连续的视频。因此,视频比图像多了一个时间维度。目前,人们对图像或视频的理解一般都限定在可见光谱上。然而,在可见光谱外的图像已经被广泛应用。例如,工作在红外谱段的用于夜间监视的照相机,工作在红外谱段和电磁谱段之间频率的太赫兹成像,以及在电磁谱段之外的医学成像应用,包括磁共振(MR)、计算机断层扫描(CT)、超声等。

理论上,图像可以用函数表示。函数值对应图像中像素点的亮度,也可以表示其他物理量,如与观察点的距离、颜色等,不同的函数值对应不同的图像类型。在图像中包含与观察点的距离信息的图像即深度图像,它将图像采集器到场景中各观察点的距离(深度)作为像素值。常见的获取深度图像的图像采集器有红外结构光相机、激光雷达、多目摄像头。RGB图像不包含与观察点的距离信息,它用红、绿、蓝(RGB)3个颜色通道来表示每个像素点的函数值,即形成了人眼能够识别的颜色图像。当RGB的值相等时,即R=G=B,图像变为灰度图像。常用的RGB图像格式有GIF、PNG、BMP、JPG等,其中,PNG、BMP、JPG图像都是静态的,而GIF图像既可以是静态的,又可以是动态的。常用的视频格式有AVI、MP4、RMVB,它们都是非实时的视频格式,而H.264是实时的视频格式。下面将介绍常见的图像格式和视频格式。

2.1.1 GIF

GIF(Graphics Interchange Format,图形交换格式)是由美国CompuServe公司于1987年提出的图像格式,它最初的目的是希望每个互联网使用者能够通过GIF文件轻易存储并交换图像数据。GIF图像是基于颜色列表的,最多支持8位(256色)。GIF图像允许在一个文件中存放多幅彩色图像,并能够进行连续的动画展示,从而形成一个循环播放的视频。

一个GIF文件的结构可分为GIF文件头、GIF数据流和GIF文件尾3部分,图2-1所示为GIF文件结构。

img

图2-1 GIF文件结构

GIF文件头由GIF署名和版本号组成,大小为6字节(Byte),用来说明使用的文件格式是GIF格式和当前所用的版本号。其中,GIF署名占用3字节,存放的是G、I、F 3个字母,每个字母占用1字节。版本号占用3字节,存放的是1987年5月发布的“87a”(8、7、a 3个字符)或1989年7月发布的“89a”(8、9、a 3个字符),或者更新的版本号。同样,每个数字或字母占用1字节。

GIF数据流由控制标识符、图像块组成。

GIF文件尾表示文件的结束,大小为1字节,其固定值为0x3B。

GIF文件以数据块为单位进行图像存储。数据块可分成3类,分别是控制块(Control Block)、图形描述块(Graphic-rendering Block)和专用块(Special Purpose Block)。在这些数据块中,逻辑屏幕描述块和全局彩色表的作用范围是整个数据流,除此之外,其他所有控制块仅控制跟在它们后面的图形描述块。

下面给出各种数据块的分类和作用。

(1)控制块:用来控制数据流或设置硬件参数的信息,包括GIF文件头、逻辑屏幕描述块、图像控制扩展块、GIF文件尾。

(2)图形描述块:用来描绘在显示设备上显示图像的信息和数据,包括全局彩色表、图像描述块、局部彩色表、表式压缩图像数据和无格式文本扩展块。

(3)专用块:存储与图像处理无关的信息,包括注释扩展块和应用程序扩展块。

2.1.2 PNG

便携式网络图形(Portable Network Graphics,PNG)是一种无损压缩的位图图像格式。最初提出这种格式是为了替代GIF和TIFF(Tag Image File Format,标签图像文件格式),同时增加一些GIF文件格式所不具备的特性。PNG使用无损数据压缩算法,压缩比高,生成的文件体积小,一般应用于网页、Java程序中。PNG文件的结构如图2-2所示。

img

图2-2 PNG文件的结构

PNG文件主要包括两部分:PNG文件标志和多个PNG数据块。

PNG文件标志是识别是否为PNG文件的标志,大小为8字节,固定值为89-50-4E-47-0D-0A-1A-0A。

PNG文件至少有3个PNG数据块,定义了两种数据块类型:一种是关键数据块(Critical Chunk),是标准的数据块;另一种是辅助数据块(Ancillary Chunk),是可选的数据块。关键数据块定义了4种标准的数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须支持这些数据块。表2-1所示为PNG文件中的数据块类型,并使用深色背景标记关键数据块。

表2-1 PNG文件中的数据块类型

img

2.1.3 BMP

BMP(BitMap,位图)是微软Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序支持。BMP格式的特点是几乎不进行压缩,包含的图像信息丰富,但也导致了占用磁盘空间过大的问题。因此,BMP在单机上更为流行。BMP文件默认的文件扩展名是.BMP或.bmp,有时也会以.DIB或.RLE作为扩展名。BMP文件的数据存放格式为从下到上、从左到右,即BMP数据是倒置的。在读取BMP文件时,从最下面的数据开始读取,依次从下到上读取数据。BMP文件的结构如图2-3所示。

img

图2-3 BMP文件的结构

BMP文件主要由4部分构成:BMP文件头、BMP信息头、调色板和BMP数据。

1.BMP文件头

BMP文件头大小为14字节,包括以下字段。

(1)文件标识符:2字节,必须为BM,即0x424D。

(2)文件大小:4字节,表示整个BMP文件的大小。

(3)保留字1:2字节,必须设置为0。

(4)保留字2:2字节,必须设置为0。

(5)偏移量:4字节,表示从BMP文件头起始位置到BMP数据的字节偏移量(以字节为单位)。因为BMP文件的调色板长度根据BMP格式的不同而变化,所以可以利用偏移量快速从BMP文件中读取图像数据。

2.BMP信息头

BMP信息头大小为40字节,包括以下字段。

(1)数据长度:4字节,表示BMP信息头的数据长度。

(2)图像宽度:4字节,以像素为单位。

(3)图像高度:4字节,以像素为单位。图像高度的值可以指明图像是正向的还是倒向的。若该值是正数,则说明图像是倒向的,即BMP存储是从下到上的;若该值是负数,则说明图像是正向的,即BMP存储是从上到下的。大多数BMP是倒向存储的。

(4)图像数据平面:2字节,表示目标设备的位面数,BMP存储的是RGB数据,该值总为1。

(5)图像像素比特数:2字节,表示一个像素点所用的比特数。该值可为1、4、8、16、24、32。

(6)压缩类型:4字节,0表示BI_RGB,不压缩,是最常用的;1表示BI_RLE8,即8bit游程编码,只用于8bit BMP;2表示BI_RLE4,即4bit游程编码,只用于4bit BMP;3表示BI_BITFIELDS比特域,只用于16/32bit BMP。

(7)图像数据大小:4字节,表示图像数据长度,图像数据信息大小=(图像宽度×图像高度×记录像素的比特)/8,单位为字节。当用BI_RGB格式时,设置为0。

(8)水平分辨率:4字节,是一个有符号整数,单位为像素/米。

(9)垂直分辨率:4字节,是一个有符号整数,单位为像素/米。

(10)实际使用的调色板索引数:4字节,当该值为0时,表示使用所有的调色板索引。

(11)重要的调色板索引数:4字节,表示对图像显示有重要影响的颜色索引数目,当该值为0时,表示所有的调色板索引都重要。

3.调色板和BMP数据

调色板是对灰度图像或索引图像而言的,彩色图像不需要调色板,其BMP信息头后紧接着BMP数据。1bit、4bit、8bit图像需要使用调色板,16bit、24bit、32bit图像不需要使用调色板,因此,调色板最多只需要256项,索引值为0~255。

调色板的大小由BMP信息头中的图像像素比特数(biBitCount)确定。

当biBitCount=1时,为2色图像,BMP中有2个调色板,每个调色板占用4字节,因此,2色图像的调色板长度为8字节。

当biBitCount=4时,为16色图像,BMP中有16个调色板,每个调色板占用4字节,因此,16色图像的调色板长度为64字节。

当biBitCount=8时,为256色图像,BMP位图中有256个调色板,每个调色板占用4字节,因此,256色图像的调色板长度为1024字节。

当biBitCount=16、24或32时,没有调色板。调色板中每4字节表示一种颜色,依次代表B(蓝色)、G(绿色)、R(红色)、alpha(透明度,32bit BMP一般不需要透明度值)。

对于用到调色板的BMP,BMP数据就是该像素颜色在调色板中的索引值;对于真彩色图像,BMP数据就是实际的RGB值。需要注意的是,BMP数据每行的字节数必须是4的整数倍,否则需要补齐。

BMP数据记录了BMP的每个像素值,记录顺序是在扫描行内从左到右,扫描行之间从下到上。BMP的一个像素值所占用的字节数由BMP信息头中的图像像素比特数确定。当biBitCount=1时,8个像素值占用1字节;当biBitCount=4时,2个像素值占用1字节;当biBitCount=8时,1个像素值占用1字节;当biBitCount=24时,1个像素值占用3字节。

2.1.4 JPEG

JPEG图像为静止连续色调图像,是一种常见的图像格式。它由联合图像专家组(Joint Photographic Experts Group,JPEG)开发。JPEG文件的扩展名为.jpg或.jpeg,它用有损压缩算法去除冗余的图像和彩色数据,在获得极高压缩比的同时展现丰富生动的图像,即可以用较小的磁盘空间得到较好的图像质量。然而,有损压缩算法将JPEG局限于显示格式,在每次保存为JPEG图像时都会丢失一些数据,因此,通常只在图像处理的最后阶段保存图像为JPEG格式。

JPEG可分为标准JPEG(Baseline JPEG)、渐进式JPEG(Progressive JPEG)和JPEG2000 3类。

(1)标准JPEG:以24bit存储单个光栅图像,是与平台无关的图像格式,支持最高级别的压缩。但是,这种压缩是有损耗的。在网页下载此类图像时,只能从上到下按顺序显示图像,直至图像资料全部下载完毕才能看到全貌。

(2)渐进式JPEG:为标准JPEG的改良格式,支持交错式传输。在网页下载此类图像时,先呈现图像的粗略外观,再慢慢呈现完整的内容,即先传输图像的轮廓,再逐步传输数据,让图像由朦胧到清晰显示。

(3)JPEG2000:为了改进JPEG基于离散余弦变换压缩方式的不足,联合图像专家组提出了JPEG2000。JPEG2000是基于小波变换的图像压缩标准,文件的扩展名通常为.jp2。在有损压缩下,JPEG2000的一个比较明显的优点是没有传统的JPEG(标准JPEG和渐进式JPEG)压缩中的马赛克失真效果。JPEG2000的失真主要是模糊失真。模糊失真产生的主要原因是在编码过程中高频量一定程度的衰减。传统的JPEG压缩也存在模糊失真的问题。在低压缩比情况下(压缩比小于10∶1),传统的JPEG图像质量有可能要比JPEG2000好。JPEG2000在压缩比较高的情况下,优势才开始明显。整体来说,和传统的JPEG相比,JPEG2000仍然有很大的技术优势,通常压缩性能大概可以提高30%以上。一般在压缩比达到100∶1的情况下,采用JPEG压缩的图像已经严重失真并开始难以识别了,但采用JPEG2000格式的图像仍可识别。有损压缩图像质量或失真程度一般用峰值信噪比(PSNR)指标来衡量。虽然峰值信噪比不能完全反映人类视觉效果,但是它仍是一个比较流行的量化指标。传统的JPEG与JPEG2000的对比如表2-2所示。

表2-2 传统的JPEG与JPEG2000的对比

img

在JPEG文件格式中,一个字(16bit)的存储使用的是摩托罗拉格式正序存放,而不是英特尔格式的逆序存放,即一个字的高字节(高8bit)在前,低字节(低8bit)在后。

JPEG文件是按段存储的,段的数量和长度并不是固定的。JPEG文件只要包含了足够的信息就能被打开。一般来说,JPEG文件常见的段有8个,分别是图像开始(Start Of Image,SOI)、图像识别信息(Application 0,APP0)、应用信息(Application n,APPn)、定义量化表(Define Quantization Table,DQT)、帧图像开始(Start Of Frame,SOF0)、定义霍夫曼表(Define Huffman Table,DHT)、扫描开始(Start Of Scan,SOS)、图像结束(End Of Image,EOI)。JPEG文件结构如图2-4所示。

img

图2-4 JPEG文件结构

每个段包含两部分,分别是标记码和压缩数据。段的一般结构如图2-5所示。

img

图2-5 段的一般结构

段长度按大端序存放,高位在前,低位在后。有些段没有段长度,也没有段内容,只有段标识和段类型,如SOI、EOI。

下面分别介绍标记码和压缩数据的含义。

(1)标记码。

标记码由2字节构成,第1字节是段标识,固定值为0xFF,每个新段都以0xFF开头。第2字节是段类型,不同的值代表不同类型的段。例如,SOI的标记码为0xFFD8。段类型有30种,然而只有10种必须被所有的程序识别,其他类型都可以忽略。表2-3所示为常见的8种类型标记码。

表2‑3 常见的8种类型标记码

img

需要注意的是,在JPEG中,0xFF具有标记的意思,因此在压缩图像数据流时,如果出现了0xFF,则需要判断是标记码还是压缩数据。

判断方法是:如果在图像数据流中遇到0xFF,则应该检测其紧接着的字符,根据该字符对应的以下各种情况,进行不同的处理。

①0x00:表示0xFF是图像数据流的组成部分,需要进行译码。

②0xD9:表示与0xFF组成标记EOI,代表图像数据流的结束和图像文件的结束。

③0xD0~0xD7:组成RSTn标记,需要忽视整个RSTn标记,即不对当前0xFF和紧接着的0xDn 2字节进行译码,并按RST标记的规则调整译码变量。

④0xFF:忽略当前0xFF,对后一个0xFF进行判断。

⑤其他数值:忽略当前0xFF,并将此数值及其之后的数值用于译码。

(2)压缩数据。

一个完整的2字节标记码后面,就是该标记码对应的压缩数据,它记录了关于JPEG文件的若干信息。其中,紧接着标记码的2字节存放的是这个段的长度,包括段内容和段长度本身,但不包括段标识和段类型的长度。段内容应不大于65533字节。

下面按一般JPEG文件中常见的8个段的排列顺序介绍各段的结构。

1.SOI

SOI是JPEG文件的文件头,格式非常简单,只包括1字节的段标识0xFF和1字节的段类型0xD8,没有数据内容。

2.APP0

APP0的标记码为0xFFE0,该标记码后包含9个具体的字段。

(1)段长度:2字节,用来表示(1)到(9)的9个字段的总长度,即不包含标记码,但包含本字段。

(2)交换格式:5字节,固定值为0x4A46494600,即字符串“JFIF0”的ASCII码。通常使用JFIF的JPEG交换格式和TFIF的JPEG交换格式。

(3)版本号:2字节,前一字节为主版本号,后一字节为次版本号。固定值一般为0x0102,表示JFIF的版本号为1.2,但也可能为其他数值,表示其他版本号。

(4)密度单位:1字节,可选值,取值为0表示无单位;取值为1表示点数/英寸;取值为2表示点数/厘米。

(5)X方向像素密度:2字节,表示水平方向的密度。

(6)Y方向像素密度:2字节,表示垂直方向的密度。

(7)缩略图水平像素数:1字节。

(8)缩略图垂直像素数:1字节。

(9)缩略图RGB位图:长度是3字节的倍数,即3×n字节,n为缩略图像素总数(缩略图X方向像素数与缩略图Y方向像素数的乘积),保存了一个24bit的RGB位图。通常情况下,如果没有缩略图,则字段(7)和(8)的取值均为0,且删除本字段。

3.APPn

APPn标记是一种扩展标记,用于存储与特定应用程序相关的数据。这些标记允许应用程序在JPEG文件中存储自定义信息,而不会影响图像的解码和显示。每个APPn标记都包含一个特定的标识符和相关的数据。n的取值范围为1~15,标记码为0xFFE1~0xFFEF,包含了应用详细信息。

APP1(标识符为“Exif”):这是用于存储图像的Exif元数据的标记。Exif数据包含有关拍摄设备、拍摄参数和其他图像信息的详细信息。

APP2(标识符为“ICC_PROFILE”):这是用于存储图像的ICC(International Color Consortium)配置文件的标记。ICC配置文件包含颜色管理信息,可用于确保图像在不同设备和软件之间的一致性显示。

APP14(标识符为“Adobe”):这是由Adobe Systems定义的一个标记,用于存储与Adobe应用程序相关的数据。它可以包含特定于Adobe软件的信息,如色彩设置和转换参数。

除了上述常见的标记,APPn标记还可以根据应用程序的需求进行自定义。每个标记的数据部分的格式及含义由相关的应用程序定义和解释。总之,APPn标记是JPEG文件中用于存储应用程序特定信息的扩展标记。它们允许应用程序在JPEG图像中附加自定义数据,以满足特定的应用需求。

4.DQT

JPEG文件一般有两个DQT,Y值(亮度)和C值(色度)各定义了一个DQT段。DQT的标记码为0xFFDB,标记码后包含两个具体的字段。

(1)段长度:2字节,表示段长度和多个量化表(QT)字段的总长度。

(2)量化表:一个DQT可以包含多个量化表,量化表数量最多为4个,每个量化表都有自己的信息字节,其中包括以下两项内容。

● 精度及量化表ID:1字节,高4bit表示精度,只有两个可选值,即0表示8bit,1表示16bit。低4bit表示量化表ID,取值范围为0~3。

● 表项:64×(精度取值+1)字节。例如,当精度取值为0时,即8bit精度,其表项长度为64×(0+1)=64字节。

5.SOF0

SOF0标记码为0xFFC0,标记码后包含6个具体的字段。

(1)段长度:2字节,(1)~(6)共6个字段的总长度。

(2)样本精度:1字节,表示每个数据样本的比特数,通常是8bit。

(3)图像高度:2字节,表示以像素为单位的图像高度。

(4)图像宽度:2字节,表示以像素为单位的图像宽度。

(5)颜色分量个数:1字节,1表示灰度图像,3表示YCrCb或YIQ彩色图像,4表示CMYK彩色图像。JPEG通常采用YCrCb彩色模型,其中,Y表示亮度,Cr表示红色分量,Cb表示蓝色分量。

(6)颜色分量信息:颜色分量个数×3字节,通常为9字节,并依次表示如下信息。

● 颜色分量ID:1字节,取值为1表示Y,2表示Cb,3表示Cr,4表示I,5表示Q。

● 采样系数:1字节,高4bit表示水平采样因子,低4bit表示垂直采样因子。采样系数以水平和垂直方向的采样率表示,通常以“水平采样率乘垂直采样率”的形式表示。采样系数决定了色度分量相对于亮度分量的采样密度,从而影响了图像的颜色信息和细节。较高的采样率可以提供更好的色彩保真度,但会增加图像文件的大小。

● 量化表号:1字节,表示当前分量使用的量化表ID。

6.DHT

JPEG文件里有两类霍夫曼表:一类用于DC(直流分量);另一类用于AC(交流分量)。一般有4个霍夫曼表,即亮度DC霍夫曼表、亮度AC霍夫曼表、色度DC霍夫曼表、色度AC霍夫曼表,最多可有6个霍夫曼表,包括两个额外的亮度霍夫曼表和色度霍夫曼表。DHT标记码为0xFFC4,该标记码后包含两个具体的字段。

(1)段长度:2字节,表示(1)~(2)两个字段的总长度。

(2)霍夫曼表(HT):一个DHT可以包含多个霍夫曼表,每个霍夫曼表都有自己的信息字节,其中包含以下字段。

● 表ID和表类型:1字节,高4bit表示表的类型,取值只有两个,即0表示DC,1表示AC。低4bit表示霍夫曼表ID。

● 霍夫曼表位表:16字节,这16个数的和应该小于或等于256。

● 霍夫曼表值表:长度为霍夫曼表位表16个数的和。例如,霍夫曼表位表的值为00-01-05-01-01-01-01-01-01-00-00-00-00-00-00-00,共16字节,其和为12,则霍夫曼表值表为12字节。

7.SOS

SOS标记码为0xFFDA,SOS后紧接的是压缩的图像数据,数据存放顺序是从左到右、从上到下。SOS标记码后包含4个具体的字段。

(1)段长度:2字节。

(2)颜色分量个数:1字节,只有3个可选值,1表示灰度图像,3表示YCrCb或YIQ彩色图像,4表示CMYK彩色图像。

(3)颜色分量信息:按颜色分量个数重复出现,每个颜色分量包括以下字段。

● 颜色分量ID:1字节,1表示Y,2表示Cb,3表示Cr,4表示I,5表示Q。

● 霍夫曼表ID:1字节,高4bit表示DC霍夫曼表ID;低4bit表示AC霍夫曼表ID。

(4)压缩图像数据:3字节,包括以下字段。

● 谱选择开始:1字节,固定值为0x00。

● 谱选择结束:1字节,固定值为0x3F。

● 谱选择:1字节,固定值为0x00。

8.EOI

EOI只有2字节的标记码,标记码为0xFFD9,表示JPEG文件的结束。

2.1.5 H.264

H.264是由ITU-T视频编码专家组(Video Coding Experts Group,VCEG)和ISO/IEC动态图像专家组(Moving Picture Experts Group,MPEG)组成的联合视频组(Joint Video Team,JVT)提出的高度压缩数字视频编/解码器标准,同时是MPEG-4第10部分。这个标准通常被称为H.264/AVC,也被称为H.264/MPEG-4 AVC,这个名称很明确地说明了H.264两方面的开发者。

在MPEG中定义了3种帧类型:帧内帧I帧、预测帧P帧,以及向前、向后或双向预测帧B帧。其中,I帧压缩效率最低,P帧压缩效率较高,B帧压缩效率最高。GOP(Group of Pictures)指的是一组相关帧的序列,其中包括3种类型的帧:I帧、P帧和B帧。

I帧通常是每个GOP的第一个帧,经过适度的压缩,作为随机访问的参考点。每个GOP中有且只有一个I帧,多个P帧或B帧,因此,两个I帧之间的帧数即一个GOP。I帧的压缩方法是帧内压缩法(P帧、B帧为帧间压缩方法),也称为关键帧压缩法。I帧压缩基于离散余弦变换的压缩技术,这种压缩算法与JPEG压缩算法类似。采用I帧压缩可达到6∶1的压缩比,并且无明显的压缩痕迹。

P帧通过充分降低图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,P帧由在它前面的P帧或I帧预测而来。它与它前面的P帧或I帧比较其中相同的信息或数据,即考虑运动的特性进行帧间压缩。P帧的压缩方法是根据本帧与相邻的前一帧(I帧或P帧)的不同点压缩本帧数据。采取P帧和I帧联合压缩的方法能够实现更高的压缩比,并且无明显的压缩痕迹。

B帧通过考虑源图像序列前面已编码帧和源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像。B帧的压缩方法是双向预测的帧间压缩方法。当把一帧压缩成B帧时,根据相邻的前一帧、本帧和后一帧数据的不同点来压缩本帧,记录本帧与前一帧和后一帧的差值。只有采用B帧压缩,才能达到200∶1的高压缩比。