Есть ли способ проверить, имеют ли два заданных растровых слоя одинаковое содержимое ?
У нас есть проблема с нашим корпоративным общим хранилищем: теперь он настолько большой, что для полного резервного копирования требуется более 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 ГБ без сжатия.
источник
raster_diff(old_img, new_img) == "Identical"
было бы проверить, что зональный максимум абсолютного значения разности равен 0, где зона берется по всему экстенту сетки. Это то решение, которое вы ищете? (Если это так, его необходимо будет уточнить, чтобы убедиться, что любые значения NoData также являются согласованными.)NoData
обработки остается в разговоре.len(numpy.unique(yourraster)) == 2
, то вы знаете, что он имеет 2 уникальных значения, и вы можете безопасно это сделать.numpy.unique
будет в вычислительном отношении более дорогим (как с точки зрения времени, так и пространства), чем большинство других способов проверить, является ли разница постоянной. Столкнувшись с разницей между двумя очень большими растрами с плавающей запятой, которые демонстрируют много различий (например, сравнение оригинала с сжатой версией с потерями), он, вероятно, навсегда потерпит неудачу или потерпит неудачу полностью.gdalcompare.py
показал большое обещание ( см. ответ )Ответы:
Попробуйте преобразовать ваши растры в numy массивы, а затем проверьте, имеют ли они одинаковую форму и элементы с array_equal . Если они одинаковы, результат должен быть
True
:ArcGIS:
GDAL:
источник
NoData
обработки,RasterToNumPyArray
по умолчанию присваивает массиву значение NoData входного растра. Пользователь может указать другое значение, хотя это не относится к случаю Мэтта. Что касается скорости, сценарию потребовалось 4,5 секунды, чтобы сравнить 2 4-битных растра с 6210 столбцами и 7650 строками (экстент DOQQ). Я не сравнивал метод с какими-либо зональными аннотациями.Вы можете попробовать скрипт gdalcompare.py http://www.gdal.org/gdalcompare.html . Исходный код скрипта находится по адресу http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/python/scripts/gdalcompare.py, и, поскольку это скрипт на python, он должен легко удалить ненужные тестируйте и добавляйте новые в соответствии с вашими текущими потребностями. Похоже, что скрипт выполняет попиксельное сравнение, считывая данные изображения из двух изображений по полосам, и это, вероятно, довольно быстрый и многократно используемый метод.
источник
Я бы посоветовал вам создать свою таблицу атрибутов растра для каждого изображения, а затем сравнить их. Это не полная проверка (например, вычисление разницы между ними), но вероятность того, что ваши изображения отличаются с одинаковыми значениями гистограммы, очень и очень мала. Также он дает вам количество уникальных значений без NoData (из числа строк в таблице). Если ваш общий счет меньше размера изображения, вы знаете, что у вас есть пиксели NoData.
источник
Самое простое решение, которое я нашел, - это вычислить некоторую сводную статистику по растрам и сравнить ее. Я обычно использую стандартное отклонение и среднее значение, которые устойчивы к большинству изменений, хотя их можно обмануть, преднамеренно манипулируя данными.
источник
Самый простой способ - вычесть один растр из другого, если результат равен 0, то оба изображения одинаковы. Также вы можете увидеть гистограмму или график по цвету результата.
источник