Чи є засіб перевірити, чи є якісь два задані растрові шари однаковим вмістом ?
У нас є проблема з нашим корпоративним обсягом спільного зберігання: він зараз настільки великий, що потрібно повне резервне копіювання. Попереднє дослідження виявляє, що один з найбільших винуватців місця, що займає місце, є растрами вмикання / вимкнення, які дійсно повинні зберігатися як 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 відповідають.)