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

相关推荐
Chrikk1 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*1 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue1 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man1 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
customer083 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
Yaml44 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
小码编匠5 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#
AskHarries5 小时前
Java字节码增强库ByteBuddy
java·后端