今回は高速省メモリな画像処理ライブラリである libvips を使ってみます。
libvips is a demand-driven, horizontally threaded image processing library. Compared to similar libraries, libvips runs quickly and uses little memory. It has around 300 operations covering arithmetic, histograms, convolution, morphological operations, frequency filtering, colour, resampling, statistics and others. – libvips: A fast image processing library with low memory needs.
- libvips: A fast image processing library with low memory needs.
- pyvips: Python Package Index (libvips Pythonバインディング)
libvips自体は著名な画像処理プロダクトですが、各スクリプト言語のバインディングライブラリや公式サイトが2017年に刷新されたようで、今後はさらに利用が普及することが予想されます。また、PythonバインディングのpyvipsはTop 10 Python libraries of 2017でも紹介されており、注目度も高くなっています。今回はこのpyvipsを使って簡単な使い方を学びます。
環境
- Ubuntu 16.04.3 LTS (Bash on Ubuntu on Windows10 Pro)
- Python 3.6.3 (conda 4.3)
- libvips 8.6.1
- pyvips 2.0.4
導入
* apt を利用する場合
1 2 |
## libvips-dev をインストールすればlibvips本体も併せてインストールされる $ sudo apt install libvips-dev |
aptでインストールするのは簡単ですが、バージョンがけっこう古いようなので注意してください。それに必須ではない依存パッケージもいろいろインストールされるようなのでミニマリストの方にはあまり印象は良くないかも。最新版かつ好きな構成で使いたいならgithubからソースをダウンロードしてきて手動でコンパイル・インストールします。
* ソースからインストールする場合
1 2 3 4 5 6 7 8 9 10 |
# libvipsのビルドに必要な以下のパッケージを事前にインストールしておく $ sudo apt install build-essential pkg-config glib2.0-dev libexpat1-dev # libvipsのソースをダウンロード・コンパイル・インストール $ wget https://github.com/jcupitt/libvips/releases/download/v8.6.1/vips-8.6.1.tar.gz $ tar zxf vips-8.6.1.tar.gz $ cd vips-8.6.1 $ ./configure $ make -j4 $ sudo make install |
./configure時に対応ファイルフォーマットが標準出力に表示されるので、必要な依存ライブラリ(libjpeg、libpngなど)も併せてインストールしておいてください。
* 確認
1 2 3 4 5 6 7 8 9 |
$ ldconfig -p | grep libvips libvipsCC.so.42 (libc6,x86-64) => /usr/local/lib/libvipsCC.so.42 libvipsCC.so (libc6,x86-64) => /usr/local/lib/libvipsCC.so libvips.so.42 (libc6,x86-64) => /usr/local/lib/libvips.so.42 libvips.so (libc6,x86-64) => /usr/local/lib/libvips.so libvips-cpp.so.42 (libc6,x86-64) => /usr/local/lib/libvips-cpp.so.42 libvips-cpp.so (libc6,x86-64) => /usr/local/lib/libvips-cpp.so $ pkg-config --cflags --libs vips -pthread -I/usr/include/libpng12 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -L/usr/local/lib -lvips -lgobject-2.0 -lglib-2.0 |
libvips本体のインストールが完了したら続けてPythonバインディングのpyvipsをインストールします。こちらはpipを使えば簡単に入ります。
1 |
$ sudo pip install pyvips |
libvips本体が事前にインストールされていない場合、pyvipsのimport時にOSErrorが出ます。
使い方
今回は動作確認を兼ねて画像入出力や簡単な画像処理を試してみます。以降はJupyter Notebookで書いたドキュメントを貼り付けます。
上記のように、pivipsとnumpy間のデータ相互変換(pyvips.Image <-> numpy.ndarray)が可能なので、OpenCVとの連携も簡単に行うことができそうですね。
おわりに
libvipsは比較的簡単な画像処理用途に特化したプロダクトで、高速省メモリな処理が特徴となっています(Speed and memory use)。もし画像処理を手軽に行いたいだけならOpenCVを導入するのは大袈裟なので、要件に応じて適切なプロダクトを採用したいですね。今回は導入部分の紹介でしたが、次回はより深掘りして調査できればと思います。
ちなみに今回のエントリーからJupyter Notebookで書いたドキュメントを時々記事に貼ろうと考えているので、GitHubにNotebook用のリポジトリを作りました。こちらも興味があれば。