画像処理なんて全くわからないのですが、必要になったのでまとめておきました。
はじめに
ジオメトリのメッシュデータをGeoTIFF化する場合は容量が非常に大きくなります。 ファイルサイズ縮小のため、GeoTIFFの圧縮は必要です。
圧縮方法は多くのアルゴリズムが提案されておりますので、いくつかの手法について概要と圧縮後のファイルサイズをまとめました。
TIFFの圧縮形式
pythonのラスタ処理用のライブラリrasterioでは 無圧縮を含めて、現時点で15種類の圧縮形式が準備されています。
参照:https://rasterio.readthedocs.io/en/latest/api/rasterio.enums.html#rasterio.enums.Compression
['none' ,'ccittfax4' ,'ccittfax5' ,'ccittrle' ,'deflate' ,'jpeg' ,'jpeg2001' ,'lerc' ,'lerc_deflate' ,'lerc_zstd' ,'lzma' ,'lzw' ,'packbits' ,'webp' ,'zstd']
これらの概要を簡単に下表にまとめました。
圧縮の仕組みまではよく理解していないです。
種類 | 概要 |
---|---|
ccittfax4 | FAXや同様の機器で電話回線を使用してモノクロ・イメージを転送するためのプロトコルとしてCCITT(国際電信電話諮問委員会)が開発 |
ccittfax5 | 同上 |
ccittrle | modified Huffman run-length encoding : 同上 |
deflate | zipと同じ形式 |
jpeg | 代表的な画像形式。非可逆圧縮 |
jpeg2001 | 多分jpeg2000だと思う。jpegの高圧縮版で可逆圧縮も可能 |
lerc1,2 | Limited Error Raster Compression (LERC)。 ラスターを複数のピクセル ブロックに分割する可逆または非可逆圧縮方式。 |
lerc_deflate | lercとdeflateの組み合わせ?サポートしているソフトウェアが少ない。 |
lerc_zstd | lercとzstdの組み合わせ?サポートしているソフトウェアが少ない。 |
lzma | Lempel-Ziv-Markov chain-Algorithm. 7zと同じ形式 |
lzw | Lempel–Ziv–Welch.圧縮効率と高速化の両面を追求している為、LZSSとハフマン符号化を組み合わせたDeflateアルゴリズム(LZHやZIP、PNGなどが採用)と比べると30%ほど圧縮効率が悪い |
packbits | 連長圧縮の改良版 |
webp | 米Googleが開発しているオープンな静止画像フォーマット。非可逆圧縮でもアルファチャンネルを扱える。 |
zstd | Facebookに所属しているYann Colletによって開発された可逆圧縮アルゴリズム。高速。 |
TIFFの圧縮サイズ
気象庁の1kmメッシュ解析雨量GPV:GRIB2形式をpython:hvplotでレンダリングする - 趣味で計算流砂水理 Computational Sediment Hydraulics for Fun Learningで使用した解析雨量のNetCDFファイルをGeoTIFFに変換して圧縮サイズの比較を行ってみます。
データは下図のとおりで、ピクセル数はlatitude: 3360longitude: 2560です。
以下のコードにより圧縮したGeoTIFFを作成しました。
import xarray as xr import rioxarray ds = xr.load_dataset('Z__C_RJTD_20180707100000_SRF_GPV_Ggis1km_Prr60lv_ANAL_grib2.nc') ds = ds.rio.write_crs('EPSG:4326', inplace = True) comp = ['none' ,'ccittfax4' ,'ccittfax5' ,'ccittrle' ,'deflate' ,'jpeg' ,'jpeg2001' ,'lerc' ,'lerc_deflate' ,'lerc_zstd' ,'lzma' ,'lzw' ,'packbits' ,'webp' ,'zstd'] for c in comp: out = ds.isel(time=0)['var0_1_200_surface'].rio.to_raster(c + '.tif', compress=c)
上記により出力されたGeoTIFFファイルの一覧は下表です。
- deflate、lzma、lzw、zstdが高圧縮でファイルサイズが30~50分の1になっている。
- その他はほとんど圧縮されていない。設定が必要か?
- 今回のファイルはデータの大半がNaNと0のため、圧縮効率が良かったと思われる。
種類 | ファイルサイズ | 備考 |
---|---|---|
none | 32.832 MB | |
ccittfax4 | 0.026 MB | ファイルエラー |
ccittfax5 | 32.832 MB | 無圧縮 |
ccittrle | 0.026 MB | ファイルエラー |
deflate | 0.418 MB | |
jpeg | 0.002 MB | ファイルエラー |
jpeg2001 | 32.832 MB | 無圧縮 |
lerc | 32.832 MB | 無圧縮 |
lerc_deflate | 32.832 MB | 無圧縮 |
lerc_zstd | 32.832 MB | 無圧縮 |
lzma | 0.646 MB | |
lzw | 1.602 MB | |
packbits | 26.233 MB | |
webp | 32.832 MB | 無圧縮 |
zstd | 0.372 MB |
参考サイト
- イメージ・ファイル・フォーマットおよび圧縮形式 : イメージ・ファイル・フォーマットおよび圧縮形式
- データ圧縮のまとめ:今更だけど、データ圧縮についてまとめてみたい | 株式会社PLAN-B
- ArcGISのラスタの圧縮:圧縮 (環境設定)—ヘルプ | ドキュメント
- GDALによるGeoTIFFの圧縮サイズ、速度の比較 : Guide to GeoTIFF compression and optimization with GDAL
- LERC compression benchmarks : LERC compression benchmarks | GPXZ Elevation API