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

相关推荐
weixin_431600441 小时前
NestJS 入门(7):生命周期钩子——构造函数和 `OnModuleInit` 差在哪?
前端·后端·学习·node.js·nest.js
小强库计算机毕业设计1 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
canonical_entropy2 小时前
关于《Mission Driver:Loop Engineering 的一种通用参考实现》的补充说明
后端·agent·ai编程
__zRainy__2 小时前
Node系列 · Node基础:Node.js 概述
后端·node.js
星火10242 小时前
【LangChain4j系列06】ChatMemory 对话记忆管理
人工智能·后端
netCode2 小时前
Git一文带你理解如何使用
后端
睡觉时不困4423 小时前
12.LangChain 1.0+ 第二篇:Prompt、结构化输出与 LCEL 组件组合.发布清单
后端
SomeB1oody3 小时前
【RustyML入门】2.13. 孤立森林
开发语言·后端·机器学习·rust·教程
苏三说技术4 小时前
为什么越来越多人用 Pi ? - 苏三说技术
后端
YHL4 小时前
🚀 SSE 服务器发送事件与 BFF 层实战
前端·后端