OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
GrabCutアルゴリズムによる前景抽出

目的

  • 画像から前景を抽出するためのGrabCutアルゴリズムを学ぶ

理論

GrabCut アルゴリズムは、英国マイクロソフトリサーチケンブリッジの Carsten Rother、Vladimir Kolmogorov、Andrew Blake によって考案された。彼らの論文 "GrabCut": interactive foreground extraction using iterated graph cuts で発表されている。ユーザーの操作を最小限に抑えて前景を抽出するアルゴリズムが必要とされ、その成果が GrabCut であった。

ユーザーの視点から見た動作は? まずユーザーは前景領域の周囲に矩形を描く (前景領域は矩形の内側に完全に収まっている必要がある)。次にアルゴリズムが反復的にセグメンテーションを行い、最良の結果を得る。これで完了。ただし場合によっては、セグメンテーションがうまくいかず、たとえば一部の前景領域が背景としてマークされたり、その逆が起きたりすることがある。その場合、ユーザーは細かな修正を行う必要がある。誤った結果がある画像上に、いくつかストロークを描けばよい。ストロークは基本的に 「おい、この領域は前景のはずだ。お前は背景とマークしたが、次の反復で直せ」 と伝えるものであり、背景の場合はその逆になる。すると次の反復で、より良い結果が得られる。

背景では何が起きているのか?

  • ユーザーが矩形を入力する。この矩形の外側はすべて確実な背景とみなされる (前述で矩形がすべてのオブジェクトを含むべきだと述べた理由はこれである)。矩形の内側はすべて未知である。同様に、前景や背景を指定するユーザー入力はハードラベリングとみなされ、処理の過程で変化しない。
  • コンピュータは、与えられたデータに基づいて初期ラベリングを行う。前景と背景のピクセルにラベル付けする (あるいはハードラベル付けする)
  • 次に、前景と背景をモデル化するために混合ガウスモデル (GMM) が使用される。
  • 与えられたデータに基づいて、GMM は学習を行い、新たなピクセル分布を作成する。すなわち、未知のピクセルは、色の統計量という観点で他のハードラベル付けされたピクセルとの関係に応じて、前景候補または背景候補のいずれかにラベル付けされる (これはクラスタリングとちょうど同じである)。
  • このピクセル分布からグラフが構築される。グラフのノードはピクセルである。さらに2つのノード、ソースノードシンクノードが追加される。すべての前景ピクセルはソースノードに接続され、すべての背景ピクセルはシンクノードに接続される。
  • ピクセルをソースノード/終端ノードに接続するエッジの重みは、そのピクセルが前景/背景である確率によって定義される。ピクセル間の重みは、エッジ情報またはピクセルの類似度によって定義される。ピクセルの色に大きな差がある場合、それらの間のエッジは低い重みを持つことになる。
  • 次に、ミニカット (mincut) アルゴリズムを用いてグラフをセグメンテーションする。これはグラフを、最小のコスト関数でソースノードとシンクノードに分離するように2つに切断する。コスト関数は、切断されるすべてのエッジの重みの総和である。切断後、ソースノードに接続されているすべてのピクセルが前景となり、シンクノードに接続されているものが背景となる。
  • この処理は、分類が収束するまで繰り返される。

これは下の画像で図示されている (画像提供: http://www.cs.ru.ac.za/research/g02m1682/)

image

デモ

次の関数を使う: cv.grabCut (image, mask, rect, bgdModel, fgdModel, iterCount, mode = cv.GC_EVAL)

引数
image入力する8ビット3チャンネル画像。
mask入出力の8ビットシングルチャンネルマスク。mode が GC_INIT_WITH_RECT に設定されているとき、マスクは関数によって初期化される。その要素は cv.grabCutClasses のいずれかの値を取りうる。
rectセグメンテーション対象のオブジェクトを含む ROI。ROI の外側のピクセルは「明らかな背景」としてマークされる。このパラメータは mode==GC_INIT_WITH_RECT のときのみ使用される。
bgdModel背景モデル用の一時配列。同じ画像を処理している間はこれを変更しないこと。
fgdModel前景モデル用の一時配列。同じ画像を処理している間はこれを変更しないこと。
iterCount結果を返す前にアルゴリズムが実行すべき反復回数。結果は mode==GC_INIT_WITH_MASK または mode==GC_EVAL を指定したさらなる呼び出しによって洗練できることに注意。
modecv::GrabCutModes のいずれかをとりうる動作モード

試してみよう