首页 > 解决方案 > Gdal减去1位光栅让我很难过

问题描述

我想用来gdal_calc从另一个文件中减去一个文件。它有效,但无论我尝试什么命令行,我总是得到错误的结果。为了您的理解,我创建了 3 个文件。

图一:

图A

图B:

图B

图片C:

结果

如您所见,我总是得到重叠的结果,但我需要另一部分。

期望的结果:

我想要的结果。

gdal_calc.py -A pica.tif -B picb.tif --outfile=result.tif --calc="A-B"

将行更改为

gdal_calc.py -A pica.tif -B picb.tif --outfile=result.tif --calc="B-A"

或交换文件名不起作用?我总是得到相同的结果。我还在尝试新东西之前删除了输出文件,所以这不是我总是查看同一个文件的问题。

标签: rastertiffgdalcalc

解决方案


你的黑白像素值是多少?通常白色为 1(或 255),黑色为 0,但这只是一个猜测。如果是这种情况,您可能需要相反的情况,例如(1-A)-(1-B)(如果您的值真的是 1 位)。

对于测试\调试,最好先将两个输入图像都转换为无符号整数数据类型。例如:
gdal_translate -ot Int32 pica.tif pica_int32.tif

这将允许结果中出现负值,因为gdal_calc 不会将数据转换为新的“工作数据类型”(例如 gdalwarp 可以这样做-wt)。所以这意味着您正在输入数据类型(可能是字节?)中进行计算。请参阅“注意”框:
https ://gdal.org/programs/gdal_calc.html#cmdoption-type

如果你要减去,并且数据类型是Byte,它可能会导致结果超出该数据类型的有效范围(如 -1)。正常的 Numpy 行为是简单地“环绕”(而不是剪辑等),因此可能会导致一些令人惊讶的结果,例如:

import numpy as np
a = np.array([1, 0, 1, 1], dtype=np.uint8)
b = np.array([0, 1, 254, 255], dtype=np.uint8)

a - b

结果是:

array([  1, 255,   3,   2], dtype=uint8)

推荐阅读