遥感影像免切片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,出现的原因可能是瓦片的大小太大或者在比较小的图像上使用瓦片。无论是哪种情况,都不建议使用瓦片的方式来组织数据。

相关推荐
Apifox41 分钟前
如何在 Apifox 中通过 Runner 运行包含云端数据库连接配置的测试场景
前端·后端·ci/cd
uhakadotcom42 分钟前
使用 Model Context Protocol (MCP) 构建 GitHub PR 审查服务器
后端·面试·github
Asthenia04121 小时前
详细分析:ConcurrentLinkedQueue
后端
uhakadotcom1 小时前
Ruff:Python 代码分析工具的新选择
后端·面试·github
uhakadotcom1 小时前
Mypy入门:Python静态类型检查工具
后端·面试·github
喵个咪1 小时前
开箱即用的GO后台管理系统 Kratos Admin - 定时任务
后端·微服务·消息队列
Asthenia04121 小时前
ArrayList与LinkedList源码分析及面试应对策略
后端
Asthenia04122 小时前
由浅入深解析Redis事务机制及其业务应用-电商场景解决超卖
后端
Asthenia04122 小时前
Redis详解:从内存一致性到持久化策略的思维链条
后端
Asthenia04122 小时前
深入剖析 Redis 持久化:RDB 与 AOF 的全景解析
后端