通过 gdal 将多个波段合并在一起......正确

Merging multiple bands together through gdal...correctly

我在 python 中使用了一些 Sentinel-2 卫星图像。现在我使用较新的(过去 2016 年)没有问题。但我需要使用一些 2016 年的。这些不是欧洲 Space 机构以相同方式预处理的!

通常当您下载一个图块时,通常会为每个卫星波段获得一个 .jp2 文件。但在较新的版本中,他们会为您预处理 RGB 版本以及普通波段。这个版本在 python 中对我来说很棒。 但是,为了创建旧图像的 RGB 版本,我需要将三个波段 (4、3、2 - R、G、B) 合并到 1 个文件中。 Gdal_merge 一开始处理得很好。当我打开图像时,它看起来很棒! 但是在将它读入 python 后,我立即注意到有些地方不对劲。图像显示为纯白色图片,上面有一些蓝色条纹。 现在我去了 gdalinfo,我自己拼接了新的工作示例和旧版本,这就是输出。

您可能会注意到,起初尺寸看起来还不错。但是条带的类型和颜色都不对。所以我在合并文件时显然做错了什么。

这是我用来将 3 个波段合并到 1 个 .jp2 文件中的命令。

gdal_merge.py -o outfile.jp2 -separate B04.jp2 BO3.jp2 BO2.jp2

现在如前所述。这会创建一个文件,当我在 QGIS 中打开它时,该文件看起来很漂亮。但在 python.

中对我没用

这是 python 导入的屏幕截图。

img为ESA预处理图像

img1 是我的混蛋 gdal_merge 导入。

这是失败的图片:p

现在看来,我对这种图像处理缺乏一些基本的了解。因此,结合 Whosebug 的智慧——我该怎么做才能将我的波段正确拼接成一个性感的 RGB,光栅模块可以正确读取它。

提前致谢:)

似乎正在发生的事情是您从原始 uint16 数据创建了一个 uint8 堆栈,因此您的所有值基本上都变成了 255,即 uint8 的最大值。

要解决此问题,只需将 -ot uint16 添加到您的调用中,一切都会正常进行。

关于组合波段,我通常采用的方法是使用 gdalbuildvrt 从您的输入文件创建一个虚拟数据集。这个 .vrt 文件只有几 kb,随后可以用于任何进一步的 GDAL 处理(并且可能被 rasterio 读取):

gdalbuildvrt -separate stack.vrt B04.jp2 BO3.jp2 BO2.jp2

您可以指定许多其他选项,例如通用分辨率(假设您要堆叠 10 米和 20 米波段)、无数据、目标范围等。

如果你想要一个真正的 GeoTIFF,只需 运行 通过 gdal_translate:

gdal_translate stack.vrt stack.tif

同样,gdal_translate 有很多很酷的选项,只需看看 documentation