Seam Carving の実装

3件のコメント

画像処理プログラミングの数ある論文の中で最もシンプルかつ結果が面白いもののひとつにSeam Carvingという手法があります.

Seam Carvingは一言で言えば画像を縮小するための手法です.画像を縮小するための手法として,バイリニア補間やバイキュービック補間などという方法が取られるのは聞いたことがあるでしょう.これらの補間法は画像のどの場所も同じ割合で小さくします.一方,Seam Carvingは,どの場所なら小さくしてもよいかを見つけて,そこを優先的に小さくします.

Seam Carvingの賢いところは,この小さくしても良い場所を「動的計画法」という,基本的なアルゴリズムの教科書にも載っている方法で見つける点です.

それゆえ,アルゴリズムは非常にシンプルで,ソースコードも200行は越えません.具体的な処理内容は以下のリンクにある論文を参照してください.

Seam carving for content-aware image resizing [Avidan and Shamir 2007]

Seam Carvingの基本アイディアは,輪郭線の少ない部分は削りとっても,見た目の変化は少ないというものです.

以下に示すコードでは,ラプラシアン・フィルタを用いて輪郭線を抽出し,その強度を用いた動的計画法で,削っても問題がなさそうな場所(Seam)を見つけます.

また,Seamが削られる過程は見ていて面白いので,下記のコードでは画像を表示後,ボタンを押すたびにSeamを削る仮定を表示するようにしています.


結果画像

入力画像01
input01

出力画像01 (横幅を50ピクセル分削っています)
output01

入力画像02
input02

出力画像02 (横幅を100ピクセル分削っています)
output02


ソースコード


今回の記事は以上になります.

最後までお読みいただき,ありがとうございました.

Seam Carving の実装」への3件のフィードバック

  1. 実際に画像のファイルを入れて動作させる時、どの部分にどのような表記でファイル名を入れればよいですか?(例えば、結果画像1のようにするにはコードのどの部分を変えていますか)
    無知な者で大変申し訳ありません。

    • プログラムの29行目にかかれている通りで動くと思います。このプログラムは入力ファイルをコマンドライン引数から読むようにしているので、プログラムは変更する必要はありません。
      Windowsをお使いであればコマンドプロンプトかPowerShellを開いて、SeamCurving.exeがあるディレクトリで、このコマンドを実行してください。
      その他の、例えばVisual Stuidoなどを使っているのであれば、プロジェクトのプロパティを開いて、デバッグの場所からコマンドライン引数を入れてください。

  2.  お返事ありがとうございます。ご指摘通りにコマンドプロンプトで「SeamCarving.exe Image.png 50」と実行したところ、output画像が表示され、コマンドプロンプト上でもwidthとheightの値と「1 seams are carves!」と出ているので、できてはいると思います。
     しかし、ボタン入力ごとにシームが削られる過程が見れるとのことですが、何か入力すると、Debug Errorというウィンドウが表示され、コマンドプロンプト上では「OpenCV(3.4.3)Error: Assertion failed」と出てしまい、処理が強制終了されてしまいます。
     色々調べたのですが、原因がわかりませんでした。何か間違っているのでしょうか。また、原因が不明な場合、処理の過程を見なくてもいいので、そのまま処理後の画像を表示させるにはどのようにコードを変更したら良いでしょうか。
     以前のメールでも言ったように、無知で大変申し訳ありません。お時間ありましたら回答をお願いいたします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください