GDAL có nên được đặt để tạo tệp GeoTIFF khi nén không? Nên sử dụng thuật toán nào?


51

Tôi có một thư mục dữ liệu GIS bao gồm chủ yếu các tệp GeoTIFF. Cả bộ nặng khoảng 1.2 GB. Tôi nhận thấy rằng nếu tôi đóng gói các nội dung vào một tarball, nó sẽ đập xuống 82 MB. Tôi muốn kiểm tra tập hợp thành một hệ thống kiểm soát sửa đổi, nó có thể được người khác làm việc và có vẻ như có một số không gian có thể được vắt kiệt.

Trang trình điều khiển GeoTIFF GDAL liệt kê nhiều tùy chọn có thể được sử dụng để tạo các tệp GeoTIFF được nén. Ngoài ra còn có rất nhiều tùy chọn ảnh hưởng đến cách mỗi thuật toán hoạt động.

Trang trợ giúp thực hiện tốt việc mô tả các tùy chọn nhưng không nói chi tiết về cách chọn thuật toán hoặc sự đánh đổi có liên quan đến mức độ nén khác nhau. Điều này dẫn đến các câu hỏi sau:

  • Ưu điểm của việc sử dụng nén là một sự tiết kiệm đáng kể trong không gian. Nhược điểm là gì? Là thông tin bị mất khi hình ảnh được nén?

  • Làm thế nào nên đi về việc chọn một thuật toán và mức độ nén. Do một số loại hình ảnh cho vay theo một thuật toán nhất định?

Câu trả lời:


85

Để chọn phương thức nén, bạn cần sử dụng một lệnh như:

gdal_translate -co "COMPRESS=method" src_dataset dst_dataset

Khi bạn sử dụng nén, sự đánh đổi lớn nhất là thời gian xử lý thêm cần thiết để giải nén hình ảnh và sau khi giải nén hình ảnh vẫn sẽ tiêu tốn cùng một lượng bộ nhớ. Về mất thông tin có hai loại nén cơ bản :

  • lossless - bảo tồn các giá trị dữ liệu gốc
  • mất dữ liệu - làm giảm dữ liệu để tiết kiệm nhiều dung lượng hơn

Bạn sẽ mất các thuật toán khi các giá trị dữ liệu gốc phải được bảo toàn, như DEM hoặc các tính năng raster. Các thuật toán như PACKBITS , DEFLATELZW là lossless và có thể được đặt hàng theo tỷ lệ nén:

  1. LZW - tỷ lệ nén cao nhất, công suất xử lý cao nhất
  2. XÌ HƠI, XẸP
  3. GÓI - tỷ lệ nén thấp nhất, công suất xử lý thấp nhất

Tỷ lệ nén vẫn phụ thuộc vào dữ liệu, nếu dữ liệu có nhiều giá trị tương tự GÓI sẽ mang lại kết quả tốt.

Trái với lossless, bạn sẽ sử dụng các thuật toán tổn thất như JPEG để nén các trình quét không phải trả về các giá trị chính xác. Ví dụ, hình ảnh chỉnh hình hoặc vệ tinh có thể được nén bằng thuật toán tổn thất.


5
+1 cho câu trả lời hay. PACKBITS là một dạng mã hóa độ dài chạy ( en.wikipedia.org/wiki/Run-length_encoding ) sẽ hoạt động tốt cho dữ liệu có nhiều giá trị liền kề (ví dụ: bạn có nhiều NULL hoặc raster được phân loại) và LZW là một thuật toán mạnh mẽ hơn, hiệu quả trên nhiều loại dữ liệu hơn. Sự đánh đổi chung là giữa không gian và tốc độ như đã đề cập, vì vậy những gì phù hợp phụ thuộc vào việc sử dụng và dữ liệu của bạn. Ngoài ra, một số phần mềm không hỗ trợ một số loại nén GeoTiff.
scw

3
đây là một bài viết hay, có liên quan linfiniti.com/2011/05/ Khăn
oeon

1
Câu trả lời tốt, nó tóm tắt các lựa chọn của bạn tốt. Cũng cần nhớ rằng mỗi phương thức nén có các tham số bạn có thể đặt, điều này sẽ ảnh hưởng đến kết quả đáng kể. @ j03lar50n, rất vui vì bạn thấy bài viết trên blog của tôi hữu ích ...
R Thiede

câu trả lời đẹp quá đơn giản và đúng trọng tâm
sys49152

@scw bạn có thể nói thêm về phần mềm nào không hỗ trợ một số loại nén nhất định - cụ thể, có phần mềm nào không hỗ trợ lzw hoặc packbits không? Hay bạn chủ yếu đề cập đến các thuật toán ít phổ biến hơn?
David LeBauer

29

Việc sử dụng lzwdeflatenén -co predictor=2có thể giúp với hình ảnh thay đổi trơn tru khi nó nén sự khác biệt từ pixel sang pixel thay vì các giá trị tuyệt đối, và những điều này sẽ có xu hướng nhỏ và có nhiều mẫu ( ref ) hơn. Dự đoán chỉ hữu ích với lzwdeflatenén, tùy chọn không có hiệu lực với các phương pháp khác.

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

Các khoản tiết kiệm dự đoán có thể là kịch tính. Tôi vừa nén lại một thư mục gồm các mô hình độ cao địa lý 16 bit sử dụng tối đa 17GB với cài đặt LZW mặc định thành chỉ 5GB với công cụ dự đoán = 2.

Có thông tin mâu thuẫn về sự khác biệt giữa các yếu tố dự đoán 2 & 3 và khi từng yếu tố được áp dụng tốt nhất ( ref1 , ref2 ). Có lẽ nhiên liệu cho một câu hỏi khác.

Một lựa chọn dễ dàng khác để tiết kiệm là -co tiled=yes. Có một số phần mềm không thể đọc được hình ảnh được xếp chồng, nhưng những phần mềm này ngày càng hiếm hơn và chủ yếu nằm ngoài GIS (Tôi không biết bất kỳ phần mềm GIS dòng chính nào hiện không đọc chúng).

Để xây dựng dựa trên câu trả lời của @ alfonx về việc sử dụng tổng quan nén : Điều này cho phép hình ảnh cơ sở được lưu trữ không mất dữ liệu, vì tính toàn vẹn dữ liệu và các kim tự tháp bị mất, vì tốc độ và tiết kiệm không gian. Nó gần như là tốt nhất của cả hai thế giới. Đối với các tổng quan nhỏ nhất có thể có gdaladdotrên các hình ảnh RGB: sử dụng nén jpeg, lấy mẫu trung bình hoặc gaussian thay cho hàng xóm gần nhất mặc định (làm cho tổng quan mượt mà hơn) và tổng quan trắc quang YCBCR. Xem trang tham khảo gdaladdo để biết thêm thông tin về các tùy chọn này (mặc dù nó không nói nhiều về việc trắc quang là gì).

Đây là một phần của tệp bó windows tôi sử dụng để áp dụng tổng quan jpeg bên ngoài cho tất cả các tiff trong một thư mục:

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

Ghi chú

GDAL 1.6.0 đã giới thiệu việc gausslấy mẫu lại có thể dẫn đến kết quả tốt hơn averagetrong trường hợp các cạnh sắc nét với các mẫu có độ tương phản cao hoặc nhiễu. Quyền hạn của 2 cấp độ (2 4 8 ...) nên được sử dụng để chọn nhân Gaussian lấy mẫu lại 3x3.

JPEG_QUALITY_OVERVIEW 85 - nếu không được chỉ định mặc định 75% được sử dụng, điều này mang lại tệp nhỏ hơn, nhưng tôi thấy 85% thỏa hiệp tốt hơn về kích thước so với đánh đổi chất lượng.

Cập nhật, 2015: GDAL 1.8 và 2.0 đã giới thiệu rất nhiều tùy chọn mới không được đề cập ở đây và tôi không có thời gian để tiêu hóa. Đọc trang định dạng gtiff chính thức , tôi chắc chắn có thêm các cài đặt hữu ích chi tiết.


10

Đối với các trình quét lớn, GeoTiff cung cấp khả năng lưu trữ các tổng quan được đánh giá thấp (trước) dưới dạng hình ảnh bổ sung vào tệp GeoTiff. Điều này có thể được thực hiện với gdaladdo (= Tổng quan về GDAL ADD). Khi tạo các tổng quan này, bạn cũng có thể yêu cầu gdal nén chúng theo cách thủ công:

gdaladdo --config COMPRESS_OVERVIEW JPEG 

Tăng tốc độ xem dữ liệu của bạn mà không cần thêm quá nhiều kích thước. Lưu ý: Các ứng dụng Geotools như Geoserver, uDig, AtlasStyler, Geopublisher đều có thể sử dụng tính năng này và thu lợi từ tổng quan.


6

Để kích hoạt giải nén hình ảnh một phần, chỉ cần sử dụng TILED = CÓ.

Peter


4

Cuối cùng, có lẽ bạn sẽ cần phải thử nghiệm với các tùy chọn khác nhau và xem những gì đáp ứng nhu cầu của bạn.

Tôi đã và đang sử dụng các GeoTIFF được nén JPEG trên các định dạng dựa trên sóng con. Kết quả của tôi đã được khá tốt. Sử dụng GDAL để làm điều này đã mang lại tỷ lệ nén tương đương với các định dạng dựa trên wavelet mà không mất quá nhiều dữ liệu. Các hit hiệu suất đi kèm với giải nén đã được chấp nhận.

Điều tôi thích nhất về cách tiếp cận này là hỗ trợ GeoTIFF gần như phổ biến, trong khi hỗ trợ cho các định dạng dựa trên wavelet không phải lúc nào cũng được đảm bảo và đôi khi phải chịu các vấn đề cấp phép khó khăn.


3

Kinh nghiệm của tôi khi so sánh nén ECW ( Wavelet nén được tăng cường ) của GeoTIFF là Bản đồ ECW là đơn đặt hàng có cường độ tốt hơn khi nén ảnh trên không có độ phân giải cao. Một ưu điểm quan trọng khác của nén dựa trên wavelet là, không giống như các định dạng cũ hơn như GeoTIFF, JPEG - không phải JPEG 2000 -, chỉ một phần của hình ảnh có thể được giải nén [ref. 1]. Tầm quan trọng của lợi thế này không được đánh giá thấp, đặc biệt khi làm việc với "lớn hơn khoảng một nửa kích thước bộ nhớ máy tính.".

Dường như - tôi chưa bao giờ có cơ hội thử nghiệm nó - rằng MrSID , một định dạng tệp dựa trên sóng con, khác, cũng thể hiện tỷ lệ nén cao hơn các định dạng "cũ" và giải nén có chọn lọc.

tham chiếu 1: http://www.ifp.uni-stuttgart.de/publications/phowo01/Ueffing.pdf


1
dariapra, hãy nhớ rằng GeoTIFF-Packbits hoặc GeoTIFF-LZW là các nén không mất mát trong khi ECW và JPEG bị mất. Nén không mất hoặc nén phải được lựa chọn cẩn thận tùy thuộc vào việc sử dụng dữ liệu trong tương lai.
markusN

1
Tôi không khẳng định rằng một định dạng nén lỏng lẻo luôn là một định dạng lưu trữ hợp lệ. Điều tôi muốn nói là việc sử dụng một định dạng như ECW là phù hợp trong một số môi trường sản xuất. Chẳng hạn, ECW là một định dạng phù hợp hơn GeoTIFF nếu chúng ta có một cá thể MapServer phục vụ các lớp ortophoto thông qua WMS. Không có gì cấm bạn cũng lưu trữ ortophoto bằng cách sử dụng nén không mất dữ liệu.
dariapra

3

Các câu trả lời của @dodobas@ matt-wilkie bao gồm hầu hết mọi thứ liên quan đến các hành vi nén và làm mờ bằng GDAL để giảm kích thước hình ảnh.

Tôi muốn thêm hai điều:

  • tài liệu định dạng tệp từ GDAL: http://www.gdal.org/frmt_gtiff.html ;
    • Xem các tùy chọn tạo ( -co), cụ thể:
      • COMPRESS
      • NUM_THREADS
      • PREDICTOR
      • ZLEVEL
  • và điều cần thiết là phải xác minh rằng phần mềm sẽ sử dụng GeoTIFF:
    • hỗ trợ phương pháp nén mong muốn;
    • khuyên bạn nên sử dụng nén.

Ví dụ: GeoServer không khuyên bạn nên nén GeoTIFF :

Như một lưu ý cuối cùng, Geotiff hỗ trợ các loại nén khác nhau, nhưng chúng tôi khuyên bạn không nên sử dụng nó. Mặc dù nó cho phép các tệp nhỏ hơn nhiều, quá trình giải nén rất tốn kém và sẽ được thực hiện trên mỗi lần truy cập dữ liệu, làm chậm đáng kể kết xuất. Theo kinh nghiệm của chúng tôi, thời gian giải nén cao hơn so với việc đọc dữ liệu đĩa thuần túy.

Điều này đặc biệt đúng nếu đã sử dụng tổng quan, ốp lát và phương tiện lưu trữ hiệu suất cao (đĩa cấp doanh nghiệp hoặc SSD).


Tôi cũng cần phải nén hình ảnh jpeg của mình vì tôi không thể chuyển đổi raster của mình thành mảng với gdalin Python. Nó đang hiển thị lỗi bộ nhớ và đôi khi hết bộ nhớ. Bất cứ ai cũng có thể biết làm thế nào tôi có thể thực hiện dòng này (gdal_translate -co "COMPRESS = method" src_dataset dst_dataset) trong python. Tôi mới sử dụng gdal. Vì vậy, đôi khi thật khó để tôi hiểu cấu trúc.
Shiuli Pervin

1
@ShiuliPervin, Đầu tiên, JPEG đã là định dạng nén (mất dữ liệu). Thứ hai, có vẻ như bạn có vấn đề về chunk chứ không phải nén. Đọc tệp trong gạch, dải hoặc chunk, thay vì tất cả cùng một lúc. Ngay cả khi tệp được nén, nó sẽ phải được giải nén khi bạn sử dụng (ví dụ: nếu tệp 4GB sử dụng 2GB trên đĩa khi nén, nó vẫn sẽ chiếm 4GB RAM khi tất cả được tải để xử lý. tiết kiệm không gian thay thế, bạn có thể muốn xem xét định dạng thưa thớt cho GeoTIFF .
Kevin

1
@ShiuliPervin, Mặc dù, tôi có thể hiểu nhầm câu hỏi của bạn. Bản thân việc nén thường sử dụng rất nhiều bộ nhớ, nhưng không nên làm tràn hệ thống của bạn, trừ khi có lỗi trong thư viện hoặc bạn được cung cấp một đối số không hợp lệ. Nếu bạn gặp sự cố với JPEG là loại nén cho GeoTIFF, có thể thử LZMA hoặc DEFLATE.
Kevin

0

Đối với những người sử dụng các phiên bản GDAL mới hơn, cũng có các lựa chọn nén ZSt Chuẩn ( ZSTD ) không mất dữ liệu (GDAL> = 2.3) và nén nén Raster Limited ( LERC ) có giới hạn ( LALC ).

Nói chung, mặc dù, ZSTDcung cấp tốc độ đọc dữ liệu nhanh hơn cả hai LZWDEFLATEvới tỷ lệ nén tương tự, mặc dù nó có thể chậm hơn một chút khi ghi tệp (tùy thuộc vào cài đặt bạn sử dụng).

Nếu bạn không quan tâm đến độ chính xác của dữ liệu (ví dụ: chỉ thực hiện trực quan hơn là phân tích), thì đó LERCcó thể là một lựa chọn tốt. Có một MAX_Z_ERRORcài đặt cho phép bạn điều chỉnh mức độ chính xác mà bạn sẵn sàng hy sinh. Ví dụ: 1 MAX_Z_ERROR=0.001hoặc 1mm đã tiết kiệm không gian 50% trong một điểm chuẩn (xem tài liệu tham khảo ).

Phần tốt nhất là bạn cũng có thể kết hợp LERCvới ZSTDviệc sử dụng COMPRESS=LERC_ZSTD! Hoặc nếu bạn thích sử dụng DEFLATE, bạn có thể làm COMPRESS=LERC_DEFLATE. Xem thêm danh sách đầy đủ các kết hợp / cài đặt tại các tài liệu GDAL GeoTIFF chính thức https://gdal.org/drivers/raster/gtiff.html#creation-options

Thông tin chi tiết và so sánh điểm chuẩn đầy đủ có thể được tìm thấy tại tài liệu tham khảo có giá trị này:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.