Нужно ли устанавливать GDAL для создания файлов GeoTIFF со сжатием? Какой алгоритм следует использовать?

51

У меня есть папка с данными ГИС, которая состоит в основном из файлов GeoTIFF. Весь набор весит около 1.2 GB. Я заметил, что, если я упакую содержимое в тарбол, оно сократится примерно до 82 MB. Я хотел бы проверить набор в системе контроля версий, так чтобы над ним могли работать другие люди, и похоже, что есть место, которое можно выжать.

На странице драйвера GDAL GeoTIFF перечислено множество параметров, которые можно использовать для создания сжатых файлов GeoTIFF. Есть также много опций, которые влияют на работу каждого алгоритма.

Страница справки хорошо описывает параметры, но не раскрывает, как выбрать алгоритм или компромиссы, связанные с различным уровнем сжатия. Это приводит к следующим вопросам:

  • Плюсы использования сжатия - это значительная экономия места. Какие минусы? Потеряна ли информация при сжатии изображения?

  • Как следует выбирать алгоритм и уровень сжатия? Некоторые типы изображений поддаются определенному алгоритму?

остроносая плоскодонная шлюпка
источник

Ответы:

86

Чтобы выбрать метод сжатия, вам нужно использовать команду вроде:

gdal_translate -co "COMPRESS=method" src_dataset dst_dataset

При использовании сжатия самым большим компромиссом является дополнительное время обработки, которое требуется для распаковки изображения, а после распаковки изображение все равно будет занимать такой же объем памяти. О потере информации существует два основных типа сжатия :

  • без потерь - которые сохраняют исходные значения данных
  • с потерями - что ухудшает данные, чтобы сохранить еще больше места

Вы бы использовали алгоритмы без потерь, когда должны быть сохранены исходные значения данных, такие как матрицы высот или растровые объекты. Алгоритмы типа PACKBITS , DEFLATE и LZW не имеют потерь и могут быть упорядочены в соответствии со степенью сжатия:

  1. LZW - самая высокая степень сжатия, самая высокая вычислительная мощность
  2. DEFLATE
  3. PACKBITS - самая низкая степень сжатия, самая низкая вычислительная мощность

Коэффициент сжатия по-прежнему зависит от данных, если данные имеют много похожих значений, PACKBITS даст хорошие результаты.

В отличие от без потерь, вы использовали бы алгоритмы с потерями, такие как JPEG, для сжатия растров, которые не должны возвращать точные значения. Например, ортофото или спутниковые изображения могут быть сжаты с использованием алгоритмов с потерями.

dodobas
источник
5
+1 за хороший ответ. PACKBITS - это форма кодирования длин серий ( en.wikipedia.org/wiki/Run-length_encoding ), которая будет хорошо работать для данных с множеством смежных одинаковых значений (если, например, у вас много NULL или классифицированных растров) и LZW - более надежный алгоритм, который эффективен для большего количества типов данных. Общий компромисс между пространством и скоростью, как уже упоминалось, так что то, что уместно, зависит от вашего использования и данных. Кроме того, некоторые программы не поддерживают определенные виды сжатия GeoTiff.
Scw
3
это хорошо, соответствующая запись linfiniti.com/2011/05/...
oeon
1
Хороший ответ, он хорошо обобщает ваши варианты. Помните также, что каждый из этих методов сжатия имеет параметры, которые вы можете установить, что значительно повлияет на результат. @ j03lar50n, рад, что вы нашли мою статью в блоге полезной ...
R Thiede
красивый ответ! так просто и прямо в точку.
sys49152
@scw, не могли бы вы рассказать подробнее о том, какое программное обеспечение не поддерживает определенные типы сжатия, в частности, есть ли какое-либо программное обеспечение, которое не поддерживает lzw или packbits? Или вы в основном имеете в виду менее распространенные алгоритмы?
Дэвид Лебауэр
29

С lzwи deflateсжатия , используя -co predictor=2могут помочь с образами , которые плавно изменяющимися , как он сжимает отличия от пикселя к пикселю вместо абсолютных значений, и они будут иметь тенденцию быть маленькими и имеют больше моделей ( реф ). Предиктор полезен только с lzwи deflateсжатием, опция не влияет на другие методы.

gdal_translate -co compress=lzw -co predictor=2 ...

Экономия предсказателя может быть драматичной. Я просто повторно сжал каталог с 16-битными моделями высот геотифов, используя 17 ГБ с настройками LZW по умолчанию, до 5 ГБ с предсказателем = 2.

Существует противоречивая информация о различиях между предикторами 2 и 3 и о том, когда каждый из них лучше всего применяется ( ref1 , ref2 ). Возможно, топливо для другого вопроса.

Еще один простой вариант для экономии -co tiled=yes. Есть некоторые программы, которые не могут читать мозаичные изображения, но они становятся все реже и в основном за пределами ГИС (сейчас я не знаю ни одного основного программного обеспечения ГИС, которое их не читает).

Чтобы построить ответ @ alfonx об использовании сжатых обзоров : это позволяет хранить базовое изображение без потерь, для обеспечения целостности данных, а пирамиды - с потерями, для скорости и некоторой экономии пространства. Это почти лучшее из обоих миров. Для наименьших возможных обзоров с gdaladdoизображениями RGB: используйте сжатие JPEG, усредненную или гауссовскую повторную выборку вместо ближайшего соседа по умолчанию (делает обзоры более плавными) и фотометрический обзор YCBCR. См. Справочную страницу gdaladdo для получения дополнительной информации об этих параметрах (хотя это не говорит о том, что такое фотометрический).

Это часть пакетного файла Windows, который я использую для применения внешних обзоров jpeg ко всем файлам в каталоге:

set _opts= -r gauss --config PHOTOMETRIC_OVERVIEW YCBCR ^
--config COMPRESS_OVERVIEW JPEG --config JPEG_QUALITY_OVERVIEW 85

for %%a in (*.tif) do gdaladdo -ro %_opts% %%a 2 4 8 16 32 64

Примечания

В GDAL 1.6.0 введена gaussпередискретизация, которая может привести к лучшим результатам averageв случае острых краев с высокой контрастностью или шумными рисунками. Необходимо использовать полномочия 2 уровней (2 4 8 ...), чтобы было выбрано ядро ​​Гаусса с передискретизацией 3x3.

JPEG_QUALITY_OVERVIEW 85 - если не указано, используется значение по умолчанию 75%, что дает меньший файл, но я считаю, что 85% - лучший компромисс в соотношении размера и качества.

Обновление, 2015: GDAL 1.8 и 2.0 представили много новых опций, которые здесь не описаны, и которые я не успел переварить. Читайте официальную страницу формата gtiff , я уверен, что есть дополнительные полезные настройки подробно.

Мэтт Уилки
источник
10

Для больших растров GeoTiff предлагает возможность сохранять (предварительно) уменьшенные изображения в виде дополнительных изображений в файле GeoTiff. Это можно сделать с помощью gdaladdo (= GDAL ADD Overview). При создании этих обзоров вы можете вручную указать gdal их сжать:

gdaladdo --config COMPRESS_OVERVIEW JPEG 

Ускоряет просмотр ваших данных без добавления слишком большого размера. Примечание: приложения Geotools, такие как Geoserver, uDig, AtlasStyler, Geopublisher, могут использовать эту функцию и получать прибыль от обзоров.

alfonx
источник
6

Чтобы включить частичную декомпрессию изображения, просто используйте TILED = YES.

Питер

Питер Хопфгартнер
источник
4

В конечном итоге вам, вероятно, придется поэкспериментировать с различными вариантами и посмотреть, что отвечает вашим потребностям.

Я все чаще использую сжатые JPEG файлы GeoTIFF по сравнению с вейвлет-форматами. Мои результаты были довольно хорошими. Использование для этого GDAL позволило получить коэффициенты сжатия, сопоставимые с форматами на основе вейвлетов, без потери данных. Хит производительности, который приходит с декомпрессией, был приемлемым.

Что мне больше всего нравится в этом подходе, так это то, что поддержка GeoTIFF является почти универсальной, в то время как поддержка форматов на основе вейвлетов не всегда гарантирована, и иногда возникают острые проблемы с лицензированием.

Роджер Д.
источник
3

Мой опыт сравнения сжатия GeoTIFF и Earth Resource Mapping в ECW ( расширенный сжатый вейвлет ) показывает, что ECW на несколько порядков лучше при сжатии аэрофотоснимков высокого разрешения. Другим важным преимуществом вейвлет-сжатия является то, что, в отличие от более старых форматов, таких как GeoTIFF, JPEG, а не JPEG 2000 , может быть распакована только часть изображения [ссылка. 1]. Важность этого преимущества не следует недооценивать, особенно при работе с «размером, превышающим половину объема памяти компьютера».

Кажется - у меня никогда не было возможности протестировать это - что MrSID , другой пропиетарный формат файлов, основанный на вейвлетах, также демонстрирует более высокие коэффициенты сжатия, чем «более старые» форматы и выборочную декомпрессию.

ссылка 1: http://www.ifp.uni-stuttgart.de/publications/phowo01/Ueffing.pdf

dariapra
источник
1
dariapra, помните, что GeoTIFF-Packbits или GeoTIFF-LZW - это сжатия без потерь, тогда как ECW и JPEG с потерями. Сжатие без потерь или с потерями должно быть тщательно выбрано в зависимости от будущего использования данных.
markNN
1
Я не утверждаю, что слабый формат сжатия всегда является допустимым форматом хранения. Я хотел сказать, что использование формата, подобного ECW, подходит в некоторых производственных средах. Например, ECW является более подходящим форматом, чем GeoTIFF, если у нас есть экземпляр MapServer, обслуживающий слои ортофото через WMS. Ничто не запрещает вам также хранить ортофото с использованием сжатия без потерь.
Дарьяпра
3

Ответы @dodobas и @ matt-wilkie охватывают почти все, что касается сжатия и размытия с помощью GDAL для уменьшения размера изображения.

Я хотел бы добавить две вещи:

  • документация формата файла от GDAL: http://www.gdal.org/frmt_gtiff.html ;
    • Смотрите параметры создания ( -co), а именно:
      • COMPRESS
      • NUM_THREADS
      • PREDICTOR
      • ZLEVEL
  • и что важно убедиться, что программное обеспечение, которое будет использовать GeoTIFF:
    • поддерживает нужный метод сжатия;
    • рекомендует использовать сжатие.

Например, GeoServer не рекомендует сжимать GeoTIFF :

В заключение отметим, что Geotiff поддерживает различные виды сжатия, но мы рекомендуем не использовать его. Несмотря на то, что он допускает гораздо меньшие файлы, процесс распаковки является дорогостоящим и будет выполняться при каждом доступе к данным, что значительно замедляет рендеринг. По нашему опыту, время распаковки выше, чем при чтении данных с чистого диска.

Это особенно верно, если уже используются обзоры, листы и высокопроизводительный носитель (корпоративный диск или SSD).

Kevin
источник
Мне также нужно сжать мое изображение в формате JPEG, потому что я не могу преобразовать свой растр в массив с помощью gdalin Python. Он показывает ошибку памяти, а также иногда не хватает памяти. Может кто-нибудь иметь представление о том, как я могу реализовать эту строку (gdal_translate -co "COMPRESS = method" src_dataset dst_dataset) в Python. Я новичок в использовании GDAL. Поэтому мне иногда трудно понять структуру.
Шиули Первин
1
@ShiuliPervin, во-первых, JPEG уже сжатый (с потерями) формат. Во-вторых, похоже, что у вас проблема с чанком, а не со сжатием. Читайте файл в виде фрагментов, полос или чанков, а не сразу. Даже если файл сжат, при его использовании он будет разархивирован (пример: если файлы 4 ГБ используют 2 ГБ на диске при сжатии, он все равно будет занимать 4 ГБ ОЗУ, когда все загружено для обработки. экономя пространство альтернативы, вы можете посмотреть в разреженное форматирование для GeoTiffs .
Kevin
1
@ShiuliPervin, хотя, возможно, я неправильно понимаю ваш вопрос. Само сжатие часто использует много памяти, но не должно переполнять вашу систему, если только в библиотеке нет ошибки или вам не задан неверный аргумент. Если у вас есть проблемы с JPEG в качестве типа сжатия для GeoTIFF, возможно, попробуйте LZMA или DEFLATE.
Кевин
0

Для тех, кто использует более новые версии GDAL, также доступны варианты сжатия без потерь ZStandard ( ZSTD ) (GDAL> = 2.3) и сжатия с ограниченным растровым сжатием с потерями ( LERC ) (GDAL> = 2.4).

В целом, однако, ZSTDпредлагает более высокие скорости чтения данных, чем оба, LZWи DEFLATEс аналогичными коэффициентами сжатия, хотя это может быть несколько медленнее при записи файла (в зависимости от того, какие настройки вы используете).

Если вы не слишком беспокоитесь о точности данных (например, выполняете только визуализацию, а не анализ), то это LERCможет быть хорошим вариантом. Существует MAX_Z_ERRORнастройка, позволяющая настроить точность, которой вы готовы пожертвовать. Например, a MAX_Z_ERROR=0.001или 1 мм дали экономию пространства на 50% в одном тесте (см. Ссылку ).

Самое приятное то, что вы также можете сочетать LERCс ZSTDиспользованием COMPRESS=LERC_ZSTD! Или, если вы предпочитаете использовать DEFLATE, вы можете сделать COMPRESS=LERC_DEFLATE. Смотрите также полный список комбинаций / настроек в официальных документах GDAL GeoTIFF https://gdal.org/drivers/raster/gtiff.html#creation-options

Более подробную информацию и полное сравнение можно найти по этой ценной ссылке:

weiji14
источник