OpenCVで透過画像の外接句形切り出し【ruby】

はじめに

アプリ実装をしていると、たまに下記のような画像を組み込む事になったりします。

20150813_icon 20150813_icon_black

※わかりにくいので、右に透過されている部分を黒で塗りつぶしたものも用意しました。

画面サイズの透過画像に対し、表示されて欲しい所にアイコンが配置されたものです。

これiPhoneならまだ良いのですが、Androidはそうもいきません、これ読み込んだらOOMまっしぐらです。 しかも数枚くらいなら良いかもしれませんが、今回これをアニメーションさせる上に、一度に10枚以上読み込む必要がありました。

それは無理なので、とりあえず上記画像を下記のように、出来るだけ余計な透過部分は省いて利用する必要があります。

20150813_icon

 

まあ、10枚くらいなら自力で切り出せば良いのですが、今回400枚以上あるんです。 そんなの自力でやってたら気を失いそうなので、自動でできないかなー、とやってみたら出来ました。

OpenCVの利用する

OpenCVでは画像内の外接矩形を取得できるので、その中で一番外側に接している矩形を出します。今回は実行するのが楽なrubyで実装しました。

と、その前にMacはrubyが入っていますが、OpenCV等は入ってないので入れます。例のごとくhomebrewを使います。

そしたら下記スクリプトを作ります、多少雑ですが・・・

 処理に関してはコメントの通りです。

これを下記の様にディレクトリを作って、imagesディレクトリに切り出したいpng画像を入れます。

スクリーンショット 2015-08-13 13.58.14

ちなみにディレクトリが切られていても大丈夫です。 そしたらターミナルでcut_img.rbを実行します。

 あとは待つだけです、処理が終われば切りだされたpngがresultディレクトリに入ります。 ちなみにrect.csvというものも一緒に生成されますが、下記のようなデータが入ります。

 これは切り出し前の画像における切り出した部分の矩形情報です。

最後に

恐らく手動でやってたら1〜2日かかりましたが、このスクリプト作ったのは2時間くらいで、400枚実行しても数分で終わるので結構短縮できました。 もしデザイン変更が来てもこれがあれば気を失うような作業をしなくても良いでしょう。 

こういうのを作るとプログラムした感があって良いですね。

●この記事を書いた人