Raw Sentinel 2 jp2到RGB geotiff


11

我正在寻找一种合并Sentinel 2 jp2波段文件(B02,B03,B04)并修复RGB颜色的方法。所有这些都应使用bash或python脚本来完成。以我为例,我处理这些图像。理想情况下,解决方案应接近教程。

我可以使用此命令合并乐队

gdal_merge.py -separate -co PHOTOMETRIC=RGB -o merged.tif B04.jp2 B03.jp2 B02.jp2

但是由于某些原因,我无法使用imagemagic命令修复RGB颜色。输出为约700MB黑色图像。

convert -channel B -gamma 1.05 -channel RGB -sigmoidal-contrast 20,20% -modulate 100,150 merged.tif merged-cc.tif

最终,我想将geotiff文件上传到mapbox上。convert欢迎解释如何选择参数。

我正在开发一个应用程序,该应用程序应猜测卫星图像的哪一部分是农田。场景图像将被切成较小的块(可能是64x64),并按CNN(cropnon-crop)分类。我使用数据集来训练Inception-v3模型。数据集包含空间分辨率为10m的64x64 RGB图像。


有关merged.tif的更多信息

Band 1 Block=10980x1 Type=UInt16, ColorInterp=Red
  Metadata:
    STATISTICS_MAXIMUM=4818
    STATISTICS_MEAN=320.61101402206
    STATISTICS_MINIMUM=0
    STATISTICS_STDDEV=536.76609312554
Band 2 Block=10980x1 Type=UInt16, ColorInterp=Green
  Metadata:
    STATISTICS_MAXIMUM=4206
    STATISTICS_MEAN=350.98505344194
    STATISTICS_MINIMUM=0
    STATISTICS_STDDEV=534.43264268631
Band 3 Block=10980x1 Type=UInt16, ColorInterp=Blue
  Metadata:
    STATISTICS_MAXIMUM=3801
    STATISTICS_MEAN=364.44611471973
    STATISTICS_MINIMUM=0
    STATISTICS_STDDEV=544.55509661709

在应用@ben解决方案前后,将其合并。 之前 后


1
tif和直方图中的最小值,平均值和最大值的位数是多少?检查gdalinfo -hist merged.tif
user30184 '17

@ user30184我在我的问题中添加了所需的信息
gkiko

我尝试将jp2转换为geotiff,然后应用颜色校正,但仍然得到黑色图像
gkiko

您为什么不只使用基本与TCI.jp2相同的图像-scale 0 4096 0 255
pLumo

1
对于农作物/非农作物,也许您可​​以使用esa-sen2agri.org/resources/software来代替从头开始创建自己的应用程序
radouxju 17-10-17

Answers:


8

问题有两个部分。首先是您要从16位转换为8位,并且gdal_translate的-scale选项可以执行此操作,如上一个答案所述。

 -scale minOriginal maxOriginal minOutput maxOutput  

第二个问题是对比度增强问题:重新缩放时,您希望对感兴趣的像素具有高对比度。警告:没有“魔术”对比度,因为在重新缩放时,通常会丢失一些信息:这样做是为了改善数据的可视化,并且专业软件无需编写新文件即可即时完成此操作。如果您想进一步处理数据,则“黑色” geotiff包含与jp2相同的信息,并准备进行处理。如果您计算例如植被指数,则应使用“原始”反射率值来完成,而不要使用重新缩放的值。就是说,这里是创建视觉增强的8位图像的一些步骤。

@ben为您提供了一种将反射率从0-1(乘以10000乘以10000)重新缩放到0-255的通用方法。这是安全的(不排除),但是只有云层和一些裸露的土壤才具有很高的反射率,因此在陆地上看不到任何东西(裸露的土壤除外),而在水中则看不到任何东西。因此,通常应用在图像上的对比度增强在于仅获取整个范围的一个子集。出于安全考虑,您可以使用以下知识:普通地球表面材料的最大反射率通常低于0.5 / 0.6(请参见此处)。对于某些示例)。当然,这是假设您的图像已经过大气校正(L2A图像)。但是,每个光谱带的反射率范围都不同,并且您感兴趣的区域中的地表并非总是最亮。这是“安全”方法的外观(最大反射率为0.4,如@RoVo建议的4096)

在此处输入图片说明

另一方面,可以针对每个波段优化对比度。您可以手动定义此范围(例如,您对水彩感兴趣,并且知道水的最大预期反射率值)或基于图像统计信息。常用的方法是保留大约95%的值,然后“丢弃”(太暗-> 0或太亮-> 255),这类似于基于平均值+/- 1.96 *定义范围标准偏差。当然,这只是一个近似值,因为它采用正态分布,但是在实践中效果很好(除非云过多或统计信息使用某些NoData值,否则除外)。

让我们以您的第一支乐队为例:

均值= 320

标准= 536

95%置信区间= [-731:1372]

但当然反射率始终大于零,因此必须将最小值设置为0。

gdal_translate -scale 0 1372 0 255 -ot Byte  B01.jp2 B01-scaled.tif  

而且,如果您使用的是gdal的最新版本,则可以使用-scale_ {band#}(默认值为0 255,因此我不再赘述),因此您无需拆分单个频段。另外,我使用vrt代替tif作为中间文件(无需编写完整映像:虚拟映像就足够了)

gdalbuildvrt -separate stack.vrt B04.jp2 B03.jp2 B02.jp2
gdal_translate -scale_1 0 1372 -scale_2 0 1397 -scale_3 0 1430 -ot Byte  stack.vrt im_rescaled.tif

请注意,您的统计信息会受到“伪像”(例如云和NoData)的强烈影响。一方面,当您具有极值时,方差被高估了。另一方面,当存在大量的“零”值时(如示例中那样使自动对比的图像太亮),您的平均值会被低估,如果云量很大(会使得图像太暗)。因此,在这个阶段,结果将不是您可以获得的最佳结果。

在此处输入图片说明

自动化的解决方案是将背景和云值设置为“ nodata”,并在不使用NoData的情况下计算您的统计信息(有关在不使用NoData的情况下计算统计信息的详细信息,请参阅此帖子示例还提供了将大于4000的值设置为NoData的示例)。对于单个图像,我通常在最大可能的无云子集上计算统计信息。使用子集中没有“ NoData”的统计信息(图像的左上角),可以得出最终结果。您可以看到该范围大约是“安全”范围的一半,这意味着您具有两倍的对比度:

gdal_translate -scale_1 38 2225 -scale_2 553 1858 -scale_3 714 1745 -ot Byte  stack.vrt im_rescaled.tif

在此处输入图片说明

最后一句话,gdal_constrast_stretch看起来不错,但我尚未测试


问题是每个颗粒的亮度都不同。根据他想要实现的目标,最好使用固定比例。-scale 0 4096 0 255如果我们不需要云纹理,则会产生非常好的输出...
pLumo

@RoVo我同意这会产生弯曲值,并且您可能会在明亮的表面(例如沙子)上失去对比度,但这是基于OP 合并图像的统计信息。您在颗粒上不会有不同的对比度。通常,红色,绿色和蓝色的范围比NIR的范围小得多,这就是为什么对每个波段使用不同的对比度才有意义。
radouxju

7

您可以简单地使用TCI.jp2文件中包含的SAFE.zip文件。请注意,2016年10月之前,这些文件在S2文件中不可用

或者,您可以使用GDAL转换频段:

# Merge bands
gdalbuildvrt -separate TCI.vrt B04.jp2 B03.jp2 B02.jp2

# Convert to uncompressed GeoTiff
gdal_translate -ot Byte -co TILED=YES -scale 0 4096 0 255 TCI.vrt TCI.tif

# _OR_ Convert to JPEG - compressed GeoTiff
gdal_translate -ot Byte -co TILED=YES -co COMPRESS=JPEG -co PHOTOMETRIC=YCBCR -scale 0 4096 0 255 TCI.vrt TCI.tif

-scale 0 4096对于Sentinel-2场景是合理的值,并且afaik也用于TCI.jp2图像。如果您想获得较浅的效果,请降低4096。


5

如果您正在寻找一个与问题链接的解决方案,则应遵循并调整本教程中提供的可下载的Landsat 8处理外壳skript

特别是,如此处所做的那样,您首先可能要重新调整单个频段,例如,如下所示:

gdal_translate -ot Byte -scale 0 10000 0 255 B04.jp2 B04-scaled.tif 
gdal_translate -ot Byte -scale 0 10000 0 255 B03.jp2 B03-scaled.tif
gdal_translate -ot Byte -scale 0 10000 0 255 B02.jp2 B02-scaled.tif

请注意,图像的直方图表明图像中只有非常暗的表面(是这种情况吗?),但通常前哨2图像将是大气顶或表面反射率,其值通常在0到0之间和10000-除非也可以使用更高的值,例如,如果图像中有云。

然后,您可以合并波段并微调图像外观:

gdal_merge.py -v -ot Byte -separate -of GTiff -co PHOTOMETRIC=RGB -o RGB-scaled.tif B04-scaled.tif B03-scaled.tif B02-scaled.tif
convert -channel B -gamma 1.05 -channel RGB -sigmoidal-contrast 20,40% -modulate 100,150 RGB-scaled.tif RGB-scaled-cc.tif

这是我的图片在执行此操作时发生的情况:

在此处输入图片说明


1
我更新了我的问题。在对geoTIFF进行色彩校正时,我应该如何决定使用哪些参数?
gkiko

从输入图像到输出图像缩放比例值时,请始终查看输入图像中的最大值和最小值。例如,对于第一带,尺度参数应该是这样进制0 4818 0 255
米洛斯Miletic
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.