我使用Sentinel-2 .jp2图像(红色带,10950 x 10950像素)。我的目标是达到与SNAP使用Python脚本相同的结果。请参阅SNAP方法和参数:



所以这是我的参考(使用SNAP的结果),我想达到此结果(QGIS灰度表示,累积切割-2 / 98%):



所以我尝试使用GDAL复制它:

import numpy as np
from osgeo import gdal, gdal_array

input = "d:/bitbucket/cnn-lcm/T33TWM_A012703_20171127T100339_B04.jp2"
output = "d:/bitbucket/cnn-lcm/T33TWM_A012703_20171127T100339_B04_gdal.tif"

dataset = gdal.Open(input)
array = dataset.ReadAsArray()

percentile_025 = np.percentile(array, 2.5) # 349.0
percentile_975 = np.percentile(array, 97.5) # 3735.0

command = 'gdal_translate -scale ' + str(percentile_025) + ' ' + str(percentile_975)+ ' 0 255 -of GTiff -ot Byte' + ' ' + input + ' ' + output

os.system(command)


GDAL结果是不一样的,它的亮度更高,白色区域更大。图层面板上的值不同(QGIS灰度表示,累积切割-2/98%):



Orfeo代码:

import otbApplication

Convert = otbApplication.Registry.CreateApplication("Convert")
Convert.SetParameterString("in", "d:/bitbucket/cnn-lcm/T33TWM_A012703_20171127T100339_B04.jp2")
Convert.SetParameterString("out", "d:/bitbucket/cnn-lcm/T33TWM_A012703_20171127T100339_B04_hcut.tif")
Convert.SetParameterString("type","linear")
Convert.SetParameterString("hcp.high","2.5")
Convert.SetParameterString("hcp.low","2.5")
Convert.ExecuteAndWriteOutput()

Rescale = otbApplication.Registry.CreateApplication("Rescale")
Rescale.SetParameterString("in", "d:/bitbucket/cnn-lcm/T33TWM_A012703_20171127T100339_B04_hcut.tif")
Rescale.SetParameterString("out", "d:/bitbucket/cnn-lcm/T33TWM_A012703_20171127T100339_B04_orfeo.tif")
Rescale.SetParameterOutputImagePixelType("out", 1)
Rescale.SetParameterFloat("outmin", 0)
Rescale.SetParameterFloat("outmax", 255)
Rescale.ExecuteAndWriteOutput()


Orfeo结果与GDAL非常相似(像素差异只有1-2个值)。中间有大的有问题的条带(QGIS灰度表示,累积剪切-2/98%):



所以最后我的问题:

是否可以消除差异?是否有可能完全达到SNAP的结果?以及如何操作?

下载数据链接:
http://sentinel-s2-l1c.s3.amazonaws.com/tiles/33/T/WM/2017/11/27/ 0 / B04.jp2

评论

如果SNAP方法“在95%裁剪的直方图之间”的结果与您的“ numpy百分位数2.5-97.5”方法的结果不同,则可能意味着SNAP正在另一种方式进行,可能基于平均值和标准偏差。也许可以从这里github.com/senbox-org/s2tbx找到它。

是的,我也这样做,但是我不确定,因为我没有找到相应的代码。

此gis.stackexchange.com/questions/172721/…还讨论了统计信息。

栅格中是否有任何数据? percentile_025 = np.percentile(array [array!= nodata],2.5)等可能会给出不同的值?

即使您在QGIS中使用了相似的可视化参数(95%的裁切率),您处理的图像(GDAL和Orfeo)也从0缩放到255,而SNAP图像从5缩放到255。 SNAP和其他图像(使用栅格计算器),以及该差异图像的直方图?这样,我们可以查看实际图像值,该图像值比可视化图像更易于解释

#1 楼

我调查了一下,但无法重现从SNAP获得的准确结果(特别是我不确定为什么输出的最小值为5)。但是,我能够确认SNAP和GDAL的结果存在显着差异。有两种见解:

GDAL正在正确实施95%剪辑。我检查了原始栅格,以确定在GDAL输出中分别映射到0/255的最小/最大值。结果是355和3729,这与您在上面确定的349/3735百分位数阈值不同。但是,它们恰好是在按所述百分位数阈值进行缩放后舍入为0/255的最小值/最大值(请参见此处)
如果将“直方图精度”参数增加到,则几乎可以使用SNAP再现GDAL输出。进行转换之前,请在“统计信息”窗口中输入最大值(6)。 SNAP / GDAL输出现在最多相差1,这是由于舍入的差异所致。

我从未使用过Orfeo,因为我从未使用过它。

评论


似乎有一个有趣的答案,如果它获得5票赞成(加1票)的支持,我会接受。由于似乎没有明显的问题答案。在对帖子发表一些反馈之后,我想我应该对其进行更新:-percentile_025 = np.percentile(array [array!= nodata],2.5)-计算栅格差异;不要在GDAL百分位数差异的背景下出现什么情况(349,355 ..)

– pnz
20-10-16在8:30



349 vs 355仅仅是因为输出数据类型是整数,因此缩放后的值必须四舍五入。在我上面链接的帖子中查找最终公式。由于我们从[349.3735]缩放到[0,255],因此我们插入min = 349,max = 3735,a = 0和b =255。然后,f(349)= 0,如预期的那样。 f(350)= 0.075 ...,但是最终将其舍入为0。f(355)= 0.451 ...是x的最大值,它将被舍入为零...之后f(356)= 0.521 ...向上舍入为1。在范围的高端(3735和3729)也会发生相同的情况。希望能澄清

–尼克
20-10-16在16:45