遥感影像免切片8:瓦片图像

1. 概述

本文主要介绍如何以瓦片的方式组织图像,而不是以条带的方式组织图像。

对于低分辨率或者中分辨率的图像而言,标准的 TIFF 文件是将图像分割为许多个条带就足够了。但是,对于高分辨率图像来说,如果图像被分割为大致正方形的瓦片而不是水平的条带,则可以更有效地访问,压缩效果也会更好。

在组织 TIFF 文件时,如果使用瓦片的方式来组织文件,则将会弃用 StripOffsets、StripByteCount 和 RowsPerStrip TAG,而是使用对应的 TileWidth、TileLength、TileOffsets 和 TileByteCounts 来表示瓦片的具体信息。但切记,不可在同一个文件中同时出现条带(Strip)和瓦片(Tile)相关的 TAG。

瓦片不一定是正方形,它们的大小由 TileWidth 和 TileLength 来确定。在同一个 TIFF 文件中,所有的瓦片的大小都是相同的,也就是说,它们具有相同的像素大小。

对于图像边界(尤其是右边界和下边界),如果图像的像素个数不能对应到一个瓦片,则使用其他数据来填充。例如,对于一个图像宽度为129、瓦片宽度为64的 TIFF 文件而言,该文件需要3个瓦片,第3个瓦片的剩余63个像素需要使用其它值来填充。填充使用的值并不重要,因为 TIFF 浏览器只展示 ImageWidth、ImageLength 定义的像素,超出该范围,将会忽略任何填充的像素。如果通过复制最后一行或者最后一列而不是使用0来填充,则对于一些压缩算法的效果会更好。

虽然将图像数据填充到图像边界的瓦片的确浪费了一些空间,但是压缩算法通常填充的区域压缩的很小甚至可以不占用空间。但也需要了解清楚的是,对于大型图像而言,即便没有使用压缩算法,填充边界瓦片(一般很小)浪费的空间也是很小的,通常在几个百分点或者更小的范围以内。

填充图像边界的瓦片的优点在于,实现可以更加简单、更快,并且与面向瓦片的压缩算法更兼容。瓦片可以被单独压缩,在压缩时,瓦片中的每一行数据可以被看作单独的"扫描线"。

2. 相关的TAG

2.1 TileWidth

  • TAG 值:322
  • 数据类型:SHORT 或者 LONG
  • 数据值个数:1个

TileWidth 以像素为单位表示瓦片的宽度,也就说,每个瓦片中有多少列的像素。它的值必须是16的整数倍。这个限制可提高某些图形环境的性能,并增强与 JPEG 等压缩方案的兼容性。

2.2 TileLength

  • TAG 值:323
  • 数据类型:SHORT 或者 LONG
  • 数据值个数:1个

TileLength 以像素为单位表示瓦片的高度或者长度,也就说,每个瓦片中有多少行的像素。它的值也必须是16的整数倍。

2.3 TileOffsets

  • TAG 值:324
  • 数据类型:LONG
  • 数据值个数:
    • 当 PlanarConfiguration 等于1时,使用 TilesPerImage(具体计算方式在2.5小节中介绍) 来表示
    • 当 PlanarConfiguration 等于2时,使用SamplesPerPixel * TilesPerImage来表示

TileOffsets 的值是一个数组,表示每个瓦片对应的相对于 TIFF 文件开头的字节偏移量,每个瓦片的偏移量是独立的,与其他瓦片的位置无关。

偏移顺序遵照从左到右、从上到下的规则。当 PlanarConfiguration 等于2时,首先存储第1个通道的偏移量,然后是第2个通道的偏移量,依次类推。

2.4 TileByteCounts

  • TAG 值:325
  • 数据类型:SHORT 或者 LONG
  • 数据值个数:
    • 当 PlanarConfiguration 等于1时,使用 TilesPerImage(具体计算方式在2.5小节中介绍) 来表示
    • 当 PlanarConfiguration 等于2时,使用SamplesPerPixel * TilesPerImage来表示

TileByteCounts 的值是一个数组,表示每个瓦片压缩后的字节大小。

2.5 相关计算规则

在 TIFF 文件生成或者解析过程中,除了上面介绍的4个 TAG,还会有几个中间值。这些中间值不是 TIFF 标准中的 TAG,它们是临时的,具体计算规则如下:

计算结果为整数

  1. TilesAcross = (ImageWidth + TileWidth - 1) / TileWidth
  2. TilesDown = (ImageLength + TileLength - 1) / TileLength
  3. TilesPerImage = TilesAcross * TilesDown

TilesAcross 由 ImageWidth 和 TileWidth 两个 TAG 来确定,用来确定在水平方向上的瓦片的数量。TilesDown 由 ImageLength 和 TileLength 两个 TAG 来确定,用来确定在垂直方向上的瓦片的数量。

TIFF 标准建议设置 TileWidth 和 TileLength,以便在压缩之前所产生的瓦片大小在 4K - 32K 字节之间。对于大多数应用程序和压缩方案而言,这也是合理的数值。

需要注意的是,ImageWidth 可以小于 TileWidth,ImageLength 也可以小于 TileLength,出现的原因可能是瓦片的大小太大或者在比较小的图像上使用瓦片。无论是哪种情况,都不建议使用瓦片的方式来组织数据。

相关推荐
Estar.Lee4 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
2401_857610035 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
凌冰_6 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
码农飞飞6 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货6 小时前
Rust 的简介
开发语言·后端·rust
monkey_meng6 小时前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
Estar.Lee7 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
新知图书7 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
盛夏绽放8 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
Ares-Wang8 小时前
Asp.net Core Hosted Service(托管服务) Timer (定时任务)
后端·asp.net