アシアルの中の人が技術と思いのたけをつづるブログ

Seam Carvingで自然に画像をリサイズするPHPエクステンション

以前に紹介した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 とします。

  1. $ tar xzf seam_carving.tar.gz
  2. $ cd seam_carving
  3. $ phpize
  4. $ ./configure
  5. $ make

modulesディレクトリにseam_carving.soができあがるので make install でインストールするなり、どこかのディレクトリにおいておきます。

準備ができたら、以下のようにしてリサイズします。

  1. <?php
  2.  
  3. dl('seam_carving.so');
  4.  
  5. $im = imagecreatefromjpeg('Antelope.jpg');
  6. $new_im = seam_imagecreate($im, 100);


画像のリサイズは seam_imagecreate関数で実行します。第1引数がGDの画像リソースで、第2引数が横方向にカットするピクセル数です。

マシンスペックにもよると思いますが、1024×768の画像を1秒で10ピクセルくらいずつカットすることができました。

これでもずいぶんとPHPプログラムでの実装よりは高速になっています。エクステンションのコードを修正すれば、まだまだ高速化できると思います。

まだまだエクステンションの書き方がわかっていないので、エラー処理ができていません。異常終了したりするかもしれません。。
そこら辺は多めに見てください^^;

コメント

    • お久しぶりです。

      今日の朝食会で、seam curving の理論を
      3次元に応用したケースについての発表がありました。

      特徴点抽出の技術とかだいぶ世の中進んでるみたいですね。
      こういう話に触れるといろいろと作ってみたいものが出てきます。
      Webサイトの特徴抽出みたいなものは実際に研究が
      行われているみたいです。
    • トラックバック撃ってみたけどうまいこといかなかったようなので。

      使ってみました。非常に面白いです。

      ただ、seam_varving.cの
       if (gdImageSX(im) > (len * 3 / 2) {
        RETURN_FALSE;
       }
      あたりが微妙に間違ってる気がします。
      とりあえず、そこは削って、使ってみてます。
    • > 野間さん
      たしかに Voxel でやってみてもおもしろそうですね。面での微分とか最小面の計算とかは単純なものでも以外とよさそうだけど、工夫してもおもしろいのかもしれません。

      というか、VOXELではなくてポリゴン状態で計算するのかな。だとしたら結構すごいですね。僕の作ったものをベクトル画像に対して応用するだけでも大変そうです。

      > cocoitiさん
      すいません。。。思いっきり間違えていました。。

      すぐ修正します。

コメントフォーム

認証
captcha_key
 

トラックバック