画像の背景を適切に見積もっている場合は、人物が写っている画像からそれを差し引くのが適切な最初のステップです。しかし、それは最初のステップにすぎません。その後、画像を分割する必要があります。つまり、画像を「背景」ピクセルと「前景」ピクセルに分割する必要があります。次のような制約があります。
- 前景領域では、背景画像との平均差が大きくなるはずです
- 背景領域では、背景画像との平均差は低くなければなりません
- 領域は滑らかでなければなりません。アウトラインの長さと曲率は最小限にする必要があります。
- 領域の境界は、ソース画像で高いコントラストを持つ必要があります
数学に精通している場合、これらの制約は Mumford-Shah 汎関数で完全にモデル化できます。詳しくはこちらをご覧ください。
しかし、おそらく他のセグメンテーション アルゴリズムを問題に適応させることができます。
高速でシンプルな (ただし完全ではない) バージョンが必要な場合は、次の方法を試してください。
- 2つの画像を差し引く
- バックグラウンドとフォアグラウンドの差がしきい値よりも大きいピクセルの最大連続「ブロブ」を見つけます。これは前景画像の「人物領域」の最初の概算ですが、セグメンテーションは上記の基準 3 と 4 を満たしていません。
- 最大のブロブの輪郭を見つけます (編集:輪郭から始める必要はないことに注意してください。手順によって自動的に最適な位置に縮小されるため、より大きな多角形から始めることもできます)。
- アウトラインの各ポイントを通過し、アウトラインを滑らかにします。つまり、各点について、式 c1*L - c2*G を最小化する点を見つけます。ここで、L は点がここに移動された場合のアウトライン ポリゴンの長さであり、G は点が移動される場所の勾配です。 c1/c2 は、プロセスを制御するための定数です。ポイントをその位置に移動します。これには、ソース イメージの勾配の低い領域 (人物の目に見える境界線) に結び付けたまま、ソース イメージの勾配の低い領域の輪郭ポリゴンを滑らかにする効果があります。L と G に対して異なる式を試すことができます。たとえば、L は長さと曲率を考慮に入れ、G は背景と減算されたイメージの勾配も考慮に入れることができます。
- おそらく、アウトライン ポリゴンを再正規化する必要があります。つまり、アウトライン上のポイントが一定の間隔で配置されていることを確認してください。それか、前のステップでポイント間の距離が一定であることを確認してください。(「測地線ヘビ」)
- 収束するまで最後の 2 つの手順を繰り返す
これで、表示されている人物と背景の境界線に接し、境界線が表示されていない場所やコントラストが低い場所で滑らかに続くアウトライン ポリゴンが作成されました。詳細については、 "Snakes" (例: ここ) を参照してください。