是否可以检查给定的2个栅格图层是否具有相同的内容?
我们的公司共享存储量有一个问题:它太大了,需要三天以上的时间才能进行完整备份。初步调查显示,占用空间最大的罪魁祸首之一是应使用CCITT压缩将开/关栅格真正存储为1位图层。
该示例图像当前为2位(因此有3个可能的值),并保存为文件系统中11 MB的LZW压缩tiff。转换为1bit(所以有2个可能的值)并应用CCITT Group 4压缩后,我们将其压缩到1.3 MB,几乎节省了一个完整的数量级。
(这实际上是一个表现良好的公民,还有其他人存储为32位浮点数!)
这真是个好消息!但是,也有将近7,000张图像可以应用。编写脚本来压缩它们将很简单:
for old_img in [list of images]:
convert_to_1bit_and_compress(old_img)
remove(old_img)
replace_with_new(old_img, new_img)
...但是它缺少一项至关重要的测试:新压缩的版本内容相同吗?
if raster_diff(old_img, new_img) == "Identical":
remove(old_img)
rename(new_img, old_img)
有没有一种工具或方法可以自动(取消)证明Image-A的内容与Image-B的内容具有相同的价值?
我可以使用ArcGIS 10.2和QGIS,但是除了可以避免手动检查所有这些图像以确保覆盖之前的正确性之外,其他所有功能都可以使用。错误地转换和覆盖确实具有超过开/关值的图像将是可怕的。其中大多数会花费数千美元来收集和生成。
更新:最大的违规者是32位浮点数,每边最大可达100,000px,因此约30GB未压缩。
NoData
在对话中保持适当的处理。
len(numpy.unique(yourraster)) == 2
,则说明它具有2个唯一值,您可以放心地执行此操作。
numpy.unique
与检查差异是否为常数的大多数其他方法相比,底层的算法在计算上(在时间和空间上)将更加昂贵。当面对表现出许多差异的两个非常大的浮点栅格之间的差异时(例如将原始版本与有损压缩版本进行比较),它可能会永远陷入困境或完全失败。
gdalcompare.py
显示出了很大的希望(请参阅答案)
raster_diff(old_img, new_img) == "Identical"
方式是检查差的绝对值的区域最大值等于0,其中该区域在整个网格范围内进行。这是您要找的解决方案吗?(如果是这样,则还需要完善以检查所有NoData值是否也是一致的。)