これにはいくつかの方法があります。エッジ検出はエッジのバイナリ イメージのみを提供し、これらの位置を検出するには、ライン トレースまたはハフ変換を実行する必要があります。精度が異なります。
目と顔の相対的な位置を検出できることを知っていると仮定します。最良の代替手段であるニューラルネットワークよりも優れたパフォーマンスで、統計フィルターが好ましい結果をもたらすと期待しています。カラー画像が使用されている場合、良い代替手段は自然にカラーセグメンテーションです (これは実装がはるかに簡単です)。また、画像内で首が多かれ少なかれ見えるように、頭の位置がわずかに変わる可能性があると仮定します.
したがって、統計フィルターの場合:
(個人の背景は、グレースケール画像を処理する場合の顔データに似ているため、カラー画像を使用する方が適切であることに注意してください)。
元の画像の空白のコピーを取ります。これで顔のバイナリマップを作成しますが、成功を簡単に調べることができる必要はありません
元の画像で顔、目、口を見つけます。
目と口からのデータは顔の一部であると想定し、空白のコピーに「1」でマークします。
顔検出アルゴリズムは、カメラに対して特定の角度でのみ顔を検出できることがわかっているため、ここで少し数学が必要です。これを使用して、画像の特定の部分の画像から統計マスクを選択します。たとえば、頬の領域から 10x10 ピクセル 2 または 3 です。これは、画像内の顔の可能性が最も高い領域になります。このデータを使用して、画像から平均値や標準偏差などの値を取得します。
次に、顔を検出した画像のセグメント化された部分をスキャンします。これには長い時間がかかるため、イメージ全体は実行しません。(注: 見られないマスクの半分のサイズの境界線があります)。各ピクセルとその周辺を 10x10 マスクのサイズで調べます。平均または標準偏差 (調べているものは何でも) がフィルターの偏差とほぼ同じである場合、たとえば 10% 以内であれば、空白のコピーでこのピクセルを「1」としてマークし、そのピクセルがスキンに属すると見なします。
カラーセグメンテーションに関して:
(注: このプロセスをグレースケールで試すこともできますが、レンガ造りのため成功率は低くなります)
手順 1 ~ 2 を繰り返します。
ここでも、顔データを含むと予想される画像の特定の領域 (つまり、目の下 10 ピクセル) を選択します。ただし、この場合、このピクセルの色を形成するデータを調べます。HSV 画像は、このプロセスと組み合わせからより良い結果を得ることができることを忘れないでください。画像全体をスキャンして、各ピクセルを調べて類似の色を見つけることができます。一致する場合は、バイナリ マップにマークします。
別の方法として、画像の RG および B スペクトルから計算された を減算または加算し、そのデータ面だけが残ります。任意の値 > 1 == 1 にすることで、これをバイナリ イメージに直接変換できます。
これはスキンに対してのみ機能し、髪には他のフィルターが必要になります。いくつかのメモ:
カラー画像で機能する統計フィルタは、はるかに優れた機能を備えていますが、時間がかかります。
画像のデータを使用して統計フィルターを作成します。これにより、他の肌の色を分類できるようになります。数学的に設計されたフィルターまたは色のセグメンテーションでは、同じ可変性を実現するために多くの作業が必要になります。
マスクのサイズは重要です。マスク サイズが大きいほど、エラーが発生する可能性は低くなりますが、処理時間は長くなります。
調べているピクセルが既に 1 (目/鼻/口の検出によって分類されている) である場合は、バイナリ マップ コピー内の同じ領域を参照することでプロセスを高速化できます。
複数のスキン フィルターを使用すると、より良い結果が得られますが、より多くのノイズが発生する可能性があり、処理時間が長くなるピクセルと比較して各フィルターを覚えておく必要があります。
アルゴリズムを正確に機能させるには、多少の試行錯誤が必要ですが、これらの方法を使用すると、同等の結果がかなり迅速に得られるはずです。
これが途中で役立つことを願っています。コードを含めなくて申し訳ありませんが、行き詰まった場合に他の人が助けてくれることを願っています。自分でコードを書くことで、何が起こっているのかを理解し、処理時間を短縮することができます。追加のアドバイスが必要な場合はお知らせください。私は画像分析の博士号を取得しているので、アドバイスが適切であることを確認してください。
気を付けて
クリス
[編集] いくつかの簡単な結果:
これは、髪の検出に適用された 20x20 フィルターです。私が書いたプログラムは、現時点ではグレースケール画像でのみ機能するため、肌の検出は石からの干渉を受けます(後述)
顔領域のカラー画像

平均ヘア フィルターのバイナリ マップ 20x20 マスク 40% エラーを許容

観察できるように、この場合、シャツは髪の色と一致しているため、シャツからの干渉があります。これは、検出された顔領域の上 3 分の 1 または半分だけを調べるだけで排除できます。
平均スキン フィルターのバイナリ マップ 20x20 マスク 40% エラー許容

この画像では、無精ひげがフィルターの動作を明らかに変えるため、あごの部分から形成されたフィルターを 1 つだけ使用しています。個人の背後にある石からのノイズがまだありますが、カラー画像を使用するとこれを除去できます。ケースのギャップは、アルゴリズムまたは別のフィルターによって埋められる可能性があります。ここでもシャツの端からのノイズがありますが、シャツを検出してそれを形成するデータを削除するか、特定の領域のみをぼんやりと見ることで、これを最小限に抑えることができます。
検査する領域の例

誤った分類を排除するために、セグメント化された画像の上 3 分の 2 を取得して、顔と、検出された目の幅から顔領域の下部までを探して、首のデータを探すことができます。
乾杯
クリス