1

シナリオ

私は皮膚から髪を検出するプログラムを書いています。これまで、私はこれを行ってきました...

  1. ソース画像を読み込み、グラブカットを適用して背景を削除

ここに画像の説明を入力

  1. 皮膚を取得するための皮膚検出の応用

ここに画像の説明を入力

  1. ANDing を実行して Hair と他の領域を取得しました

ここに画像の説明を入力

  1. 輪郭検出を実行して、最大サイズの輪郭を取得しました

ここに画像の説明を入力

Imgproc.drawContours(mask, contours, maxAreaIndex, new Scalar(255,255,255),1);

問題

コードを使用してfindContourを実行して取得したマスクを埋めようとすると

Imgproc.drawContours(mask, contours, maxAreaIndex, new Scalar(255,255,255),Core.FILLED);

のように輪郭を塗りつぶします

ここに画像の説明を入力

今、これをマスクとして使用することはできません。これは、結果が次のように生成されるためです。

ここに画像の説明を入力

これは私が望むものではありません。

この問題で塗りつぶされた輪郭を実現する方法を誰かが提案できますか?

4

1 に答える 1

0

完全な輪郭を確実に取得するために、輪郭を抽出する前に膨張侵食 (クロージング) フィルタリングを適用することができます。基本的に、拡張侵食が行うことは、通常は互いに近くにある分離されている輪郭領域を、交差するように拡張して閉じ、次に交差した輪郭を縮小して、正しくスケーリングされたままにすることです。このトピックの詳細については、こちらをご覧ください。

ただし、この方法では、画像内のほとんどの髪が検出されていることを前提としています。あなたがしたことは違います。写真で NOT SKIN を検出し、髪が最大の輪郭であると想定しました。こうすることで、輪郭を閉じると、特に人物のシャツがハイカットになっている画像で、シャツと髪を検出するという問題が発生する可能性があります。このフィルタリングを適用する前に、人物のシャツをセグメント化するステップをパイプラインに追加します。

幸運を!

于 2016-05-07T18:52:49.820 に答える