Есть ли способ проверить, имеют ли два заданных растровых слоя одинаковое содержимое ?
У нас есть проблема с нашим корпоративным общим хранилищем: теперь он настолько большой, что для полного резервного копирования требуется более 3 дней. Предварительное расследование показало, что одним из самых больших занимающих пространство виновников являются растры включения / выключения, которые действительно должны храниться в виде 1-битных слоев со сжатием CCITT.
Это примерное изображение в настоящее время 2-битное (так 3 возможных значения) и сохранено как сжатый формат LZW, 11 МБ в файловой системе. После преобразования в 1 бит (таким образом, 2 возможных значения) и применения сжатия CCITT Group 4 мы сократили его до 1,3 МБ, что является почти полным порядком экономии.
(Это на самом деле очень хорошо ведущий себя гражданин, другие хранятся как 32-битные числа с плавающей точкой!)
Это фантастические новости! Тем не менее, есть почти 7000 изображений, чтобы применить это тоже. Было бы просто написать скрипт для их сжатия:
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 000 пикселей в стороне, то есть ~ 30 ГБ без сжатия.
NoData
обработки остается в разговоре.
len(numpy.unique(yourraster)) == 2
, то вы знаете, что он имеет 2 уникальных значения, и вы можете безопасно это сделать.
numpy.unique
будет в вычислительном отношении более дорогим (как с точки зрения времени, так и пространства), чем большинство других способов проверить, является ли разница постоянной. Столкнувшись с разницей между двумя очень большими растрами с плавающей запятой, которые демонстрируют много различий (например, сравнение оригинала с сжатой версией с потерями), он, вероятно, навсегда потерпит неудачу или потерпит неудачу полностью.
gdalcompare.py
показал большое обещание ( см. ответ )
raster_diff(old_img, new_img) == "Identical"
было бы проверить, что зональный максимум абсолютного значения разности равен 0, где зона берется по всему экстенту сетки. Это то решение, которое вы ищете? (Если это так, его необходимо будет уточнить, чтобы убедиться, что любые значения NoData также являются согласованными.)