![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
GrabCut アルゴリズムは、英国マイクロソフトリサーチケンブリッジの Carsten Rother、Vladimir Kolmogorov、Andrew Blake によって考案された。彼らの論文 "GrabCut": interactive foreground extraction using iterated graph cuts で発表されている。ユーザーの操作を最小限に抑えて前景を抽出するアルゴリズムが必要とされ、その成果が GrabCut であった。
ユーザーの視点から見た動作は? まずユーザーは前景領域の周囲に矩形を描く (前景領域は矩形の内側に完全に収まっている必要がある)。次にアルゴリズムが反復的にセグメンテーションを行い、最良の結果を得る。これで完了。ただし場合によっては、セグメンテーションがうまくいかず、たとえば一部の前景領域が背景としてマークされたり、その逆が起きたりすることがある。その場合、ユーザーは細かな修正を行う必要がある。誤った結果がある画像上に、いくつかストロークを描けばよい。ストロークは基本的に 「おい、この領域は前景のはずだ。お前は背景とマークしたが、次の反復で直せ」 と伝えるものであり、背景の場合はその逆になる。すると次の反復で、より良い結果が得られる。
背景では何が起きているのか?
これは下の画像で図示されている (画像提供: http://www.cs.ru.ac.za/research/g02m1682/)
次の関数を使う: 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 を指定したさらなる呼び出しによって洗練できることに注意。 |
| mode | cv::GrabCutModes のいずれかをとりうる動作モード |