Rustで画像入出力

みなさん,Rust使ってますか?
新元号がRustに決まったことは記憶に新しいですね.
まだ使っていないよ!という方もこれを機に始めてみてはいかがでしょうか.

さて今回はRustで画像処理を行うために画像入出力用のcrateであるimageを使ってみたいと思います.
https://docs.rs/image/0.20.1/image/

GolangではC++実装のOpenCVを直接呼出しました( GolangでもOpenCVしたい!!! ).
RustでもOpenCVのラッパであるcv-rsを使ってもよいのですが,どのみち処理はすべて自分で書くので入出力だけできればよく,今回はimageを選びました.(imshowが出来ないのはちょっと不便かも).

今回はサンプルとしてグレースケール化を実装します.
もちろん画像読み込み時に直接グレースケールとして解釈すればよいのですが,一連の処理フローを確認するという意味でいくつかの方法でべた書きで実装します.

コードは以下.

使い勝手はそれなりにいいですが,いくつかうーんと思う仕様もあります.
たとえばget_pixelは範囲外にアクセスした際にpanicしてしまいますが,RustなのだからOptionで返すなどしてほしいです.
またget_pixel時のオプションとして範囲外アクセス時の挙動(clamp, wrapなど,CUDAでいうところのアドレッシングモード)の指定ができるとよいですね.
他にもimage::Rgbで各要素に.r()/.g()/.b()でアクセスできるようにしたり,まだまだ開発途上感はありますが,PNGやJPEGを自前でエンコード/デコードしなくてよいのはそれだけで非常にありがたい事です.

FnMutを画像として読み込むことが出来るのも極めて興味深い点です.
テスト用の合成画像を作りたい場合や簡単なフィルタを適用したいときに便利かと思います.

最後に,image crateに限らず,もしライブラリのビルドに失敗する場合はrustup updateを適用してみてください.rustcのバージョン違いでビルドできていない可能性があります(一敗).

それではみなさん,Rustで楽しい画像処理ライフを.

Posted on