波段按行交叉格式 (BIL)、波段按像元交叉格式 (BIP) 以及波段顺序格式 (BSQ) 是三种用来为多波段影像组织影像数据的常见方法。BIL、BIP 和 BSQ 本身并不是影像格式,而是用来将影像的实际像素值存储在文件中的方案。这些文件支持单波段影像和多波段影像的显示,并且可以处理黑白、灰度、伪彩色、真彩色以及多光谱影像数据。
BIL、BIP 和 BSQ 文件是二进制文件,并且必须具有关联的 ASCII 文件头才能被正确解释。该头文件包含有关影像的辅助数据,例如,影像的行数和列数,如果存在色彩映射表,则还包含纬度和经度。
波段按行交叉格式数据针对影像的每一行按波段存储像素信息。例如,有一个三波段影像,所有这三个波段的数据将被写入第 1 行,然后是第 2 行,依此类推,直至达到影像的总行数。下图显示了一个三波段数据集的 BIL 数据:
波段按像元交叉格式数据与 BIL 数据类似,不同之处在于每个像素的数据是按波段写入的。以同一个三波段影像为例,波段 1、2 和 3 中第一个像素的数据将写入第 1 列中,然后是第 2 列,依此类推。
波段顺序格式按每次一个波段的方式存储影像的信息。也就是说,首先存储波段 1 中所有像素的数据,然后是波段 2 中所有像素的数据,依此类推。
影像描述文件
BIL、BIP 或 BSQ 文件可以提供三种描述文件:头文件 (.hdr):用来描述影像像素数据的布局,且必须提供该文件;色彩文件 (.clr):用来描述影像色彩映射表;统计文件 (.stx):针对影像的每个波段描述影像统计数据。这些 ASCII 文本文件可通过影像的已知信息在文本编辑器中生成。
头文件
头文件描述影像数据。必须为每个影像生成一个头文件,同时该文件的文件名应该与影像的文件名相同,且扩展名为 .hdr,例如:<image>.hdr。
头文件包含一组条目,其中的每个条目描述影像的某个特定属性。例如,某个条目可以描述影像中的行数或列数。每个条目的格式为 <keyword> <value>,其中 <keyword> 指示所设置的特定属性,而 <value> 表示要为该属性设置的目标值。文件头中的条目可以按任意顺序排列,但每个条目必须单独占用文件的一行。文件中任何未以关键字开头的行均被视为注释,并且会被忽略。
头文件具有有效的关键字,并描述了每个关键字所定义的特定影像属性。其中的几个关键字包含默认值。如果默认值能准确表示影像数据,则可在头文件中忽略该关键字。
nrows 关键字表示影像中的行数。行类似于地图坐标系的 x 轴。没有默认值。
ncols 关键字表示影像中的列数。列类似于地图坐标系的 y 轴。没有默认值。
nbands 关键字表示影像中的光谱波段数。默认值为 1。
nbits 关键字表示每个波段中各个像素的位数。可接受的值为 1、4、8、16 和 32。每个波段中各个像素的位数默认为 8 位 如果某个真彩色影像具有三个波段 (RGB) 且每个波段中各像素的位数为 8 位,则 nbits 等于 8 而 nbands 等于 3,因此,每个像素的总位数为 24 位。如果影像的 nbits 等于 1,则 nbands 必须也等于 1。
pixeltype 关键字表示像素类型为有符号整型。除非使用关键字 pixeltype 并且其值为 SIGNEDINT,否则均假设您的数据使用的是无符号整数。
byteorder 关键字表示存储影像像素值所采用的字节顺序。对于每个像素 2 个字节的 16 位影像来说,字节顺序非常重要。可接受的值如下:
- I - Intel 字节顺序(Silicon Graphics、DEC Alpha、PC),也称为小字节
- M - Motorola 字节顺序(Sun、HP 及其他),也称为大字节
默认字节顺序与执行软件的主机所用的字节顺序相同。
layout 关键字表示影像文件中波段的组织结构。可接受的值如下:
- bil - 波段按行交叉格式。这是默认设置。
- bip - 波段按像元交叉格式。
- bsq - 波段顺序格式。
skipbytes 关键字表示为到达影像数据起始处而在影像文件中跳过的数据字节数。此关键字用于绕过文件中现有的全部影像文件头信息。默认值为 0 字节。
ulxmap 关键字表示地图中左上角像素中心的 x 轴坐标。如果指定该参数,还必须设置 ulymap;否则会使用默认值。
ulymap 关键字表示地图中左上角像素中心的 y 轴坐标。如果指定该参数,还必须设置 ulxmap;否则会使用默认值。
xdim 关键字表示像素的 x 尺寸(采用地图单位)。如果指定该参数,还必须设置 ydim、ulxmap 和 ulymap;否则会使用默认值。
ydim 关键字表示像素的 y 尺寸(采用地图单位)。如果指定该参数,还必须设置 xdim、ulxmap 和 ulymap;否则会使用默认值。
下图显示了 ulxmap、ulymap、xdim 和 ydim 的默认值。左上角像素中心的地图坐标 (ulxmap, ulymap) 为 (nrows - 1)),而左下角像素中心的坐标为 (0, 0)。此图中,ulxmap 和 ulymap 的坐标值为 (0, 3)。x 像素和 y 像素尺寸将默认为 xdim = 1 和 ydim = 1。
bandrowbytes 关键字表示每行中每个波段的字节数。该关键字的值必须为整数。仅当某行中每个波段末尾处均存在必须跳过的多余位时,才会在 BIL 文件中使用该关键字;可将其视为数据中下一个波段起点的索引。从某行中任何波段的开头处开始,沿该行移动 bandrowbytes 就会到达下一个波段的开头。
下图显示了三波段影像中某一行的数据。在此处,bandrowbytes 是用于存储影像数据的字节数与必须跳过以到达下一个波段的多余位的总和。
bandrowbytes = image data + extra bits
要设置 bandrowbytes,必须了解影像数据的布局,更具体地说,使用多少个字节来存储一行中每个波段的像素值。如果未指定 bandrowbytes,则使用以下方程式计算默认值:
bandrowbytes = the smallest integer(ncols x nbits) / 8
默认值处理的情况包括:某行中每个波段的末尾处均不存在多余的尾随位,以及每行中各个波段的字节数是完全用来存储波段数据的最小整型字节数;例如,如果某个数据需要 2.5 个字节,则可存储该数据的最小整型字节数就是 3 个字节。在这两种情况下,不需要设置 bandrowbytes。但是,如果每行中每个波段的字节数大于默认值,则需相应地设置 bandrowbytes。
以下两个示例显示的是 bandrowbytes 的默认行为。第一个示例描述的是某行中波段的末尾处没有尾随位,而第二个示例描述的是存在尾随位的情况。
- 如果波段的末尾处没有多余的尾随位,则 bandrowbytes 等于用来存储影像数据的字节数。
例如,某个 6 × 6 的影像具有三个波段且每个像素为 8 位(1 个字节),则该影像数据每行的每个波段均需要 6 个字节。bandrowbytes = image data
默认情况下,会将 bandrowbytes 设置为 6 个字节,如以下公式所示:bytes per band per row = ncols x nbits = 6 x 8 = 48 bits or 6 bytes
因为每行中每个波段的字节数等于 bandrowbytes,所以默认值即为合适的设置。因此,不需要显式指定 bandrowbytes。bandrowbytes = (ncols x nbits) / 8 = (6 x 8) / 8 = 48 / 8 bandrowbytes = 6 bytes
- 如果某行中波段的末尾存在尾随位,则 bandrowbytes 将不等于每行中每个波段的数据字节数。
假设有一个三波段影像包含 5 行和 5 列,且每个像素为 4 位。默认情况下,会将 bandrowbytes 设置为完全存储数据所需的最小整型字节数。在这种情况下,默认值为 3。流向计算如下:
然而,按照 ncols 乘以 nbits 的方式计算,该影像数据只需要 2.5 个字节。因此,要跳过的字节数为 0.5 个字节(4 位),或者说 3 字节 (bandrowbytes) 与 2.5 字节(影像数据字节)的差值。下图显示的是影像中某一行的一个波段的数据。bandrowbytes = (ncols x nbits) / 8 = (5 x 4) / 8 = 20 / 8 = 2.5 = 3 (when rounded up to the nearest integer)
totalrowbytes 关键字表示每一行的数据字节总数。当每行的末尾存在多余的尾随位时,使用 totalrowbytes。
对于 BIL 文件,使用以下公式计算 totalrowbytes 的默认值:
totalrowbytes = nbands x bandrowbytes
默认值假定每行末尾不存在多余的尾随位。如果存在尾随位,则需相应地设置 totalrowbytes。例如,某个三波段影像的 bandrowbytes 等于 3,则 totalrowbytes 默认等于 9。如果行末尾存在多余的尾随字节数据,请将 totalrowbytes 设置为 10。
对于 BIP 文件,请使用以下公式计算默认值:
totalrowbytes = (ncols x nbands x nbits) / 8
totalrowbytes 的值会向上舍入为可以完全存储该行像素数据的最近整型字节数。例如,某个 5 行乘 5 列的 BIP 影像有 3 个波段,且每个像素为 4 位,则 totalrowbytes 的默认值如下:
totalrowbytes = (ncols x nbands x nbits) / 8
= (5 x 3 x 4) / 8
= 60 / 8
= 7.5
= 8 (when rounded up to the nearest integer)
上图显示的是 BIP 影像的默认 totalrowbytes 设置。
如果 totalrowbytes 的默认值不能准确地表示数据的布局,则必须将 totalrowbytes 设置为每行中相应的字节数。
bandgapbytes 关键字表示 BSQ 格式影像中波段之间的字节数。默认值为 0。
以下是一个可能针对波段按行交叉格式的卫星影像生成的典型头文件,其中,影像数据前面有一个 128 字节的文件头。
Sample BIL header file
Lines that don't begin with a keyword are treated as comments.
nrows 1024 Comments can be placed here as well.
ncols 1024
nbands 3
nbits 8
layout bil
skipbytes 128
下表汇总了可在 .hdr 文件中使用的关键字:
关键字 | 可接受的值 | 默认 |
---|---|---|
nrows | > 0 的任何整数 | 无 |
ncols | > 0 的任何整数 | 无 |
nbands | > 0 的任何整数 | 1 |
nbits | 1, 4, 8, 16, 32 | 8 |
pixeltype | SIGNEDINT | 无符号整型 |
byteorder | I = Intel;M = Motorola | 与主机相同 |
layout | bil、bip、bsq | bil |
skipbytes | 大于等于 0 的任何整数 | 0 |
ulxmap | 任何实数 | 0 |
ulymap | 任何实数 | nrows - 1 |
xdim | 任何实数 | 1 |
ydim | 任何实数 | 1 |
bandrowbytes | > 0 的任何整数 | 最小整数 ≥ (ncols x nbits) / 8 |
totalrowbytes | > 0 的任何整数 | 对于 bil:nbands x bandrowbytes;对于bip:最小整数 ≥ (ncols x nbands x nbits) / 8 |
bandgapbytes | 大于等于 0 的任何整数 | 0 |
色彩文件
色彩文件 (.clr) 是一个可选文件,用于描述单波段伪彩色影像的影像色彩映射表。如果该文件不存在,影像将显示为灰度影像。
色彩文件记录要与影像中的像素值关联的颜色。颜色使用 RGB 颜色模型来定义,该模型按颜色中所包含的红色、绿色、蓝色的量来描述颜色。该文件由一组条目组成,每个条目单独占用一行,用来描述与影像中每个像素值相对应的颜色。
每个条目的格式为 <value> <red> <green> <blue>,其中 <value> 为指定的像素值,<red>、<green> 和 <blue> 为像素的颜色分量。所有条目根据像素值按升序进行排列。如果各行上第一个非空字符不是数字,则该行将被视为注释并被忽略。行中第四个参数 (blue) 之后的任何非空字符均会被忽略,而且也可用作注释。
红色、绿色和蓝色分量使用取值范围为 0 到 255 的色标来描述。随着颜色值的增大,特定颜色分量的色彩强度也随之增大。没有条目的像素值的默认颜色为黑色。以下显示的是一个像素值为 11、16、18、19、21、98 和 99 的栅格土壤地图的色彩文件示例:
Color file for Soils map
Entries are sorted in ascending order by pixel value.
11 255 0 0 (red)
16 255 165 0 (orange)
18 255 255 0 (yellow)
19 0 255 0 (green)
21 0 0 255 (blue)
98 0 255 255 (cyan)
99 160 32 240 (purple)
色彩文件仅与单波段影像一同使用。任何具有色彩文件的单波段影像均被视为伪彩色影像。与多波段影像一起使用的色彩文件将被忽略。
统计文件
统计文件 (.stx) 是一个可选文件,用于描述灰度影像或多波段影像中每个光谱波段的影像统计数据。该文件由一系列条目组成,每个条目对应一个波段,用来记录最小像素值、最大像素值、平均值、标准差以及两个线性对比度拉伸参数。
每个条目的格式(其中每个波段的所有值均显示在文件中的同一行上)如下:
<band> <minimum> <maximum> {mean} {std_deviation}
{linear_stretch_min} {linear_stretch_max}
该文件的每个组件如下所述:
- <band> 是波段号。
- <minimum> 是波段中的最小像素值。
- <maximum> 是波段中的最大像素值。
- {mean} 是平均像素值。
- {std_deviation} 是标准差。
- {linear_stretch_min} 是为线性对比度拉伸的最小像素值。
- {linear_stretch_max} 是为线性对比度拉伸的最大像素值。
每个参数的值均输入在同一行中。第一个非空字符不是数字的任何条目均被视为注释,并被忽略。波段号以及最小像素值和最大像素值为必需参数;平均值、标准差、线性拉伸最小值以及线性拉伸最大值为可选参数。使用数字符号 (#) 可跳过可选参数。
波段号的取值范围为 1 到 nbands。linear_stretch_min 和 linear_stretch_max 参数用于增大所显示影像的对比度。如果像素值小于 linear_stretch_min,则显示为黑色;如果像素值大于 linear_stretch_max,则显示为白色。落在最小线性拉伸参数与最大线性拉伸参数之间的像素值将使用灰色色调显示,像素值越小,将以越深的灰色色调显示。
落在线性拉伸参数之间的像素值将使用显示设备上提供的最大灰色色调显示。
如果未指定 linear_stretch_min 和 linear_stretch_max,则默认情况下将平均值减去两倍标准差作为 linear_stretch_min,而将平均值加上两倍标准差作为 linear_stretch_max。如果未给出标准差,则将最小像素值和最大像素值用作对比度拉伸参数。
对于多波段影像,将在显示复合影像之前拉伸每个波段。如果存在色彩文件 (.clr),则不考虑单波段影像的线性对比度拉伸,而是将该影像显示为伪彩色影像。
以下显示的是每个波段中各像素为 8 位的四波段卫星影像的统计文件示例:
Image statistics file
1 2 118 67 10
Band 2 has linear contrast stretch parameters:
2 23 251 112 23 80 90
3 68 91 73 4
Band 4 does not contain values for mean and standard deviation:
4 126 198 # # 135 167