趣味で計算流砂水理

趣味で計算流砂水理 Computational Sediment Hydraulics for Fun Learning

数値計算とか河川工学とかプログラミングのことを書いています

MENU

画像処理のど素人がまとめたpythonによるTIFF圧縮形式の比較

スポンサーリンク

画像処理なんて全くわからないのですが、必要になったのでまとめておきました。


TL;DR
  • TIFF画像作成時には多くの圧縮形式が準備されている
  • 今回の事例では、deflate、lzma、lzw、zstdによる圧縮でファイルサイズが30~50分の1になった。

はじめに

ジオメトリのメッシュデータを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

参考サイト