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

相关推荐
苍何7 分钟前
免费版 Typeless来了,不限额度,夯!
后端
Charlie_Byte1 小时前
Integer 缓存机制(JDK 17 源码)
后端
梨涡泥窝1 小时前
JavaWeb——基于 Spring Boot + Vue 的图书管理系统的设计与实现
vue.js·spring boot·后端
jsl_jsl_jsl2 小时前
LLM工具调用速记
后端
YIAN2 小时前
手撸社区后端:一套可落地的用户 - 文章 - 互动体系 MySQL 表设计与优化思路
后端·mysql
ThinkerQAQ_2 小时前
并发编程(一):先谈硬件——从 count++ 到原子性、可见性与有序性
后端
岁月如歌77862 小时前
分布式锁完全指南:从数据库到 Redisson 的演进
java·后端·架构
技术猫2 小时前
记一次因线程池不合理使用导致生产拨测告警
后端
写后端的胖头鱼2 小时前
【高频面试题】spring事物失效场景(带原理 + 代码示例)
java·后端·spring·事务·事物失效
JohnCarter20212 小时前
双卡 Atlas 300I Duo 部署 Qwen3-VL-32B:血泪实录
后端