Seam Carvingで自然に画像をリサイズするPHPエクステンション
- 2008/01/31
森川穣
以前に紹介したSeam Carvingという技術を使用したプログラムをPHPエクステンションで実装してみました。
実験的なものなのでご利用は自己責任でお願いします。
少し前の話題となってしまいますが、Seam Carvingを使用した画像のリサイズが話題になりました。
オンラインサービスでresizrというものまで出てきているようです。
ロジック自体は単純なので割とすぐにPHPで実装できたのですが、パフォーマンスが最悪だったのです。
そこで、PHPエクステンションなら何となるかなと思いトライしてみました。
seam_carving.tar.gz
※ cocoiti さんの指摘を修正しました。ご指摘ありがとうございます!
以下のように画像を縮小することができます。
元画像(1024×768)

768×768
かなりスムーズなリサイズです。

512×768
半分になっても意外と大丈夫ですね。

256×768
さすがに4分の1にまで縮小すると汚くなってしまいます。

エクステンション自体のインストールはtar.gzを解凍して、phpize、configure、make とします。
modulesディレクトリにseam_carving.soができあがるので make install でインストールするなり、どこかのディレクトリにおいておきます。
準備ができたら、以下のようにしてリサイズします。
画像のリサイズは seam_imagecreate関数で実行します。第1引数がGDの画像リソースで、第2引数が横方向にカットするピクセル数です。
マシンスペックにもよると思いますが、1024×768の画像を1秒で10ピクセルくらいずつカットすることができました。
これでもずいぶんとPHPプログラムでの実装よりは高速になっています。エクステンションのコードを修正すれば、まだまだ高速化できると思います。
まだまだエクステンションの書き方がわかっていないので、エラー処理ができていません。異常終了したりするかもしれません。。
そこら辺は多めに見てください^^;
実験的なものなのでご利用は自己責任でお願いします。
少し前の話題となってしまいますが、Seam Carvingを使用した画像のリサイズが話題になりました。
オンラインサービスでresizrというものまで出てきているようです。
ロジック自体は単純なので割とすぐにPHPで実装できたのですが、パフォーマンスが最悪だったのです。
そこで、PHPエクステンションなら何となるかなと思いトライしてみました。
seam_carving.tar.gz
※ cocoiti さんの指摘を修正しました。ご指摘ありがとうございます!
以下のように画像を縮小することができます。
元画像(1024×768)
768×768
かなりスムーズなリサイズです。
512×768
半分になっても意外と大丈夫ですね。
256×768
さすがに4分の1にまで縮小すると汚くなってしまいます。
エクステンション自体のインストールはtar.gzを解凍して、phpize、configure、make とします。
- $
tar xzf seam_carving.tar.gz - $
cd seam_carving - $
phpize - $
./configure - $
make
modulesディレクトリにseam_carving.soができあがるので make install でインストールするなり、どこかのディレクトリにおいておきます。
準備ができたら、以下のようにしてリサイズします。
- dl('seam_carving.so');
- $im
= imagecreatefromjpeg('Antelope.jpg'); - $new_im
= seam_imagecreate($im, 100);
画像のリサイズは seam_imagecreate関数で実行します。第1引数がGDの画像リソースで、第2引数が横方向にカットするピクセル数です。
マシンスペックにもよると思いますが、1024×768の画像を1秒で10ピクセルくらいずつカットすることができました。
これでもずいぶんとPHPプログラムでの実装よりは高速になっています。エクステンションのコードを修正すれば、まだまだ高速化できると思います。
まだまだエクステンションの書き方がわかっていないので、エラー処理ができていません。異常終了したりするかもしれません。。
そこら辺は多めに見てください^^;
コメント
コメントフォーム
トラックバック
最近の記事
- もうすぐ健康診断があるんだ・・・ [2010年09月02日 : 阿部恵]
- Photoshopで壁紙を作りながら、基本的な使い方を覚える [2010年09月01日 : 鴨田健次]
- はじめての共同作業 Canvas編 (node.js + websocket) [2010年09月01日 : 中川善樹]
- 「PHP×Flex(後編)」PHPテクニカルセミナー(無料)第4弾の募集を開始しました!! [2010年08月26日 : 和田記光]
- 【HTML5】Canvasでお絵かきしてみた(前編) [2010年08月25日 : 橋本章史]
- MacにgroongaのMySQL用ストレージエンジン [2010年08月23日 : 笹亀弘]
- Appleのサイトで見たiPhone4をFireworksで描いてみました-1/2 [2010年08月19日 : 和田記光]
- iPad版の会社紹介を作ってみました [2010年08月19日 : 小林有佳]
- iPhoneアプリ開発開始時に気をつけるべきファイルの取り扱い (2) [2010年08月19日 : 亀本大地]
- symfonyセミナー動画無料公開! [2010年08月13日 : 岡本雄樹]



今日の朝食会で、seam curving の理論を
3次元に応用したケースについての発表がありました。
特徴点抽出の技術とかだいぶ世の中進んでるみたいですね。
こういう話に触れるといろいろと作ってみたいものが出てきます。
Webサイトの特徴抽出みたいなものは実際に研究が
行われているみたいです。
使ってみました。非常に面白いです。
ただ、seam_varving.cの
if (gdImageSX(im) > (len * 3 / 2) {
RETURN_FALSE;
}
あたりが微妙に間違ってる気がします。
とりあえず、そこは削って、使ってみてます。
たしかに Voxel でやってみてもおもしろそうですね。面での微分とか最小面の計算とかは単純なものでも以外とよさそうだけど、工夫してもおもしろいのかもしれません。
というか、VOXELではなくてポリゴン状態で計算するのかな。だとしたら結構すごいですね。僕の作ったものをベクトル画像に対して応用するだけでも大変そうです。
> cocoitiさん
すいません。。。思いっきり間違えていました。。
すぐ修正します。