Goを使った違和感のない画像リサイズができるライブラリ「Caire」を試す
縦横比を無視したリサイズをしても違和感のない画像に仕上げることができる画像リサイズ用ライブラリ「Caire」が気になって仕方がなかったので試してみました。 Caire is a content aware image […]
目次
縦横比を無視したリサイズをしても違和感のない画像に仕上げることができる画像リサイズ用ライブラリ「Caire」が気になって仕方がなかったので試してみました。
Caire is a content aware image resize library based on Seam Carving for Content-Aware Image Resizing paper.
前提
$ go version
go version go1.10.1 darwin/amd64
ない人はbrew install go
などで入れておきましょう。
インストール
brewで入ります。便利ですね。
$ export GOPATH="$HOME/go"
$ export PATH="$PATH:$GOPATH/bin"
$ brew tap esimov/caire
$ brew install caire
$ caire --help
Usage of caire:
-blur int
Blur radius (default 1)
-debug
Use debugger
-height int
New height
-in string
Source
-out string
Destination
-perc
Reduce image by percentage
-sobel int
Sobel filter threshold (default 10)
-square
Reduce image to square dimensions
-width int
New width
使ってみる
早速画像を編集してみましょう。今回はこのAWSカルタの画像を使ってみます。

以下のようにコマンドを実行します。
$ caire -in aws_karuta_phptp.jpg -out ./out.jpg -width=20 -height=20 -perc=1
Processing... -
Rescaled in: 23.08s
Saved as: out.jpg
そして出力されたファイルが以下のものです。

多少カードが歪な形になっていますが、全体としてはそこまで違和感のあるリサイズにはなっていないかなと思います。
もう一枚ためす
せっかくなのでもう1枚。

20%圧縮でテスト
こちらも先程と同じ条件で圧縮してみます。
$ caire -in APC_0193.jpg -out ./sakura.jpg -width=20 -height=20 -perc=1
Processing... |
Rescaled in: 1074.28s
Saved as: sakura.jpg
元画像のサイズが大きいため、少々時間がかかりました。

背景のぼかしが強くなっている気がしますが、違和感のない形になっているかなと思います。ファイルサイズが大きくなっていますが、あくまで画像の切り詰めがメインと考えて割り切る場面かなという気はします。
50%圧縮でテスト
どうせなのでもっと思いっきり圧縮してみましょう。それぞれ50%まで減らしてみます。
$ caire -in APC_0193.jpg -out ./sakura1.jpg -width=50 -height=50 -perc=1
Processing... |
Rescaled in: 1957.58s
Saved as: sakura1.jpg
先程の倍ほど時間がかかりました。圧縮する部分の計算量が増えるなどでしょうか。

そしてなんとも言えない独特な画像に。何事もやり過ぎは禁物ですね。
縦長画像を正方形に
最後に個人的に一番試してみたかったケースをトライしてみます。

縦長で撮らないと収まらないけど、縦長そのままで使うのはちょっと・・・というケースですね。
高さを50%削れば(理論上)横長になるはずなので、試してみます。
$ caire -in moon.jpg -out ./moon1.jpg -height=50 -perc=1
Processing... \
Rescaled in: 1074.90s
Saved as: moon1.jpg

いい感じになりました。雲の形も違和感なく圧縮されていますね。
どう使う?
とりあえず無難にローカルで実行するところからかなぁと思っています。実行時間がそこそこかかるので、AWS Lambdaでやるにはちょっと工夫がいりそうかなぁという気もします。(そもそもGoのとりまわしがよくわかってない問題もある)