将重新采样的正射影像概述的无数据区域设为白色?


9

我有一组正射影像,每个影像都完全充满了数据,但是当放在一起时,coverage不会形成矩形,因此没有数据区域。

在MapGuide中,我需要能够将这些无数据区域显示为白色,以便我的用户在打印时不必浪费黑色墨水。

在大规模情况下,我直接显示原始的全分辨率图像,这没有问题。我只是将地图的背景色设置为白色,而没有正射影像的区域显示背景。

为了提高性能,我需要能够将所有这些源图像合并到重新采样的合成概览图像中,以便以较小的比例显示,从而可以一次查看更多的正射影像。

我一直在尝试使用GDAL对总览进行合并和重新采样,但是默认情况下,它似乎创建了重新采样的复合GeoTIFF图块,其在nodata区域中为黑色,并且MapGuide不允许我将黑色设置为在彩色栅格上透明。

我有办法有效地获得想要的东西吗?

我已经提供了最终使用GDAL的答案,但是很想看到使用其他图像处理实用程序和GIS应用程序(包括开源和专有)的解决方案。

Answers:


15

对我来说,最简单的方法是使用GDAL虚拟格式。这种格式使我可以将整个图像集视为一个图像对象,并通过三个相对简单的步骤对其进行转换。

创建虚拟数据集

GDAL(包括塔马斯·塞凯赖什GISInternals Windows二进制和的最新版本OSGeo4W)包括一个实用程序称为gdalbuildvrt其可以用于建立一个初始虚拟数据集。

一种简单的使用方法是将所有图像添加到文本文件,然后将该文本文件用作gdalbuildvrt的输入。这是一个示例(您需要将第二个命令放回一行):

dir /b *.tif > my_images.txt
gdalbuildvrt 
  -hidenodata 
  -vrtnodata "255 255 255" 
  -resolution highest 
  -input_file_list my_images.txt 
  my_image.vrt

这将为您留下一个XML文件,您可以将其视为所有GDAL操作的单个图像。它还在内部将nodata表示为白色,但从读取它的工具中隐藏了nodata定义。

创建重新采样的概览

接下来,您将执行概述图像的重新采样和输出。您可以使用gdal_translategdalwarp进行此操作。对于这两种情况,请记住,结果大小将为width * height * 3(8位带的数量)字节。如果大于4GB,则需要查看GeoTIFF选项的语法,以将BigTIFF指定为输出(-co“ BIGTIFF = YES”)。

对于gdal_translate,您将需要使用方便的gdalinfo命令确定虚拟映像的尺寸。取这些尺寸,然后将每个尺寸除以某个一致的因子,以确定文件的输出宽度和高度(以像素为单位)。

该命令看起来像(一行):

gdal_translate
  -outsize 53120 14000
  -co "TILED=YES"
  -co "PROFILE=GEOTIFF"
  -co "BLOCKXSIZE=256"
  -co "BLOCKYSIZE=256"
  my_image.vrt
  my_image.tif

对于gdalwarp,您需要知道最终的像素大小。在这种情况下,我使用的是.5米。您还需要调用重采样方法。对于正射影像概述,我更喜欢三次样条。它比较柔和,但是您不会将它们用于完整分辨率,并且根据我的经验,如果您使用的是JPEG或ECW之类的图像,它可以创建更可压缩的图像。

gdalwarp 
  -r cubicspline 
  -of GTiff 
  -dstnodata "255 255 255" 
  -tr 0.5 0.5 
  -co "PROFILE=GEOTIFF" 
  -co "BIGTIFF=YES" 
  -co "TILED=YES" 
  -co "BLOCKXSIZE=256"
  -co "BLOCKYSIZE=256"
  my_image.vrt 
  my_image.tif

对于这些重新采样的GeoTIFF概述,您可能还需要考虑使用JPEG压缩选项。它大大缩小了输出文件,(仅根据Frank的说法)仅对性能造成了很小的影响。

  -co "COMPRESS=JPEG" 
  -co "JPEG_QUALITY=80" 
  -co "PHOTOMETRIC=YCBCR"

概观

您还需要对生成的图像运行handy gdaladdo命令以构建内部“金字塔”,以便可以通过数据子集满足对分辨率低于全图尺寸的要求。在大多数情况下,性能的提高超过了磁盘空间的价值。您将需要在这里使用的关卡进行测试。对于非常大的图像,您可以删除一些图像。gdaladdo命令看起来像这样:

gdaladdo 
  -r average 
  my_image.tif 
  2 4 8 16 32 64 128 256

我建议尝试使用这些级别以获得最佳性能。您可能会发现,不同的重采样间隔更适合您的应用,或者,根据图像大小,您可以删除一些较高的数字(或者需要更多)

另外,如果要生成外部概述(使用-ro选项),请考虑添加JPEG压缩配置行:

  --config COMPRESS_OVERVIEW JPEG 
  --config PHOTOMETRIC_OVERVIEW YCBCR 
  --config INTERLEAVE_OVERVIEW BAND 

(我认为这些是继承自上级GeoTIFF的嵌入式概述)

笔记

遇到此问题时,我在freenode.irc.net的#gdal频道上询问。这是一个了不起的资源,我对Howard Butler,Frank Warmerdam和Even Rouault的帮助深表感谢。


感谢您的完整,花时间,而且我确定是时候来解决整个工作流程,而不仅仅是解决问题的特定环节。
马特·威尔基

1
有趣的是,看看gdalsetnull.py是否可以在VRT上运行,然后就不需要“在文本编辑器中编辑VRT文件,添加<NoDataValue />实体”了
马特·威尔基

1
@matt wilkie,这绝对是该网站的一部分工作,需要重写和格式化,但我之前也将其作为我的博客中较大的工作流程的一部分进行了介绍:jasonbirch.com/nodes/2009/08/11/290/fwtools- ftw-gdal的 建议绝对值得一试!
JasonBirch 2010年

常规Windows cmd注意:使用脱字符号^可在执行时加入换行符(例如^,在上述每个代码行示例的末尾添加,以保持可读性和可运行性)。重要警告:除非您要调用调用所有内存,否则切勿以插入符号结束文件或命令行
matt wilkie 2014年

3

是的,但是通过反复试验,我能够断定-vrtnodata 255的作用是将白色的所有内容标记为nodata,而不仅仅是在地图外,gdal2tiles然后根据-a标志将其视为具有alpha透明度。

这样一来,您最终会将部分源图像设置为透明的,在我的情况下,这是虚线道路的白色部分。这不是终端,但可以确定为gdal2tiles指定“无src图像”颜色,这是由于vrt中原始空隙或变形的结果。对于我的电视机来说,淡蓝色就可以了。

经过更多的反复试验后,似乎hidenodata是关键。我不知道为什么这些工具的文档很少。这对我有用,gdal 1.8。

gdalbuildvrt test.vrt -vrtnodata "209 231 245" -hidenodata BX*.tif BY*.tif
gdal2tiles -p raster -s nztm.prj test.vrt out

另请参见gdal nearblack实用程序gdal.org/programs/nearblack.html,该实用程序仅处理图像边缘周围的像素,而忽略中间的像素
Matt wilkie

0

我对GDAL不太熟悉,但是我想有一种方法或命令可以在其中设置某个值与另一个值的像素?

与它无关,但在普通的SQL中类似(仅说明-这是更多的伪代码):

UPDATE栅格设置像素= 255 WHERE像素= NoData;

我想知道答案!


GDAL确实提供了几种在处理过程中以类似于伪代码的方式用其他颜色替换颜色的方法,以及一个称为Nearblack的独立实用程序,该实用程序可用于清理包含压缩伪像的图像边缘,并根据需要将它们变为白色。这些都不适合我当时使用的大量数据。
JasonBirch 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.