0

映画「アバター」のように、人間の肌の色を青に変えたいです。次のコードを使用して、肌の色のピクセルを決定し、それらの色を置き換えました。

 /*
 R > 95 AND G > 40 AND B > 20 AND

    max{R, G, B} – min{R, G, B} >15 AND

    |R – G| > 15 AND

    R > G AND R > B

    OR

    R > 220 AND G > 210 AND B > 170 AND

    |R – G| <= 15 AND

    R > B AND G > B    */




    if(((red>95)&&(green>40)&&(blue>20)&&(red-green>15)&&(red>green)&&(red>blue))||((red>220)&&(green>210)&&(blue>170)&&(red-green<=15)&&(red>blue)&&(green>blue))){


        data[i]=255; 
            data[i+1]=100-(190-red); 
            data[i+2]=200-(190-green); 
            data[i+3]=255;


    }

この方法は、ダウンロードした顔画像の色白の肌に適しています。

ここに画像の説明を入力してください

しかし、私がカメラから実際の写真を撮るとき、それは皮膚全体を着色するのではなく、部分だけを着色します:

ここに画像の説明を入力してください

さまざまな肌の色の肌の色のピクセルを置き換える方法はありますか?

4

2 に答える 2

2

残念ながら、完璧な肌のセグメンテーションは未解決の(またはおそらく解決できない?!)問題です。「多すぎる」ピクセルを含める必要がない場合は、しきい値を開いて、青みがかった色相でピクセルの「より多く」を着色することができます。ただし、背景のピクセルや衣服のピクセルも変色するという問題が発生します。ショットの背景にある絵は、肌ではありませんが、すでに青色になっています。その時点で、あなたの唯一の選択肢は、よりスマートなセグメンテーション手法(おそらく適応手法)を使用して、肌の色のピクセルをより適切に選択することだと思います。

于 2012-04-30T15:15:27.363 に答える
0

Quartzを使用すると、特定の色の範囲を定義する画像を作成して、次のように置き換えることができます。

CGImageRef myMaskedImage;
const float myMaskingColors[6] = {124, 255,  68, 222, 0, 165};
myColorMaskedImage = CGImageCreateWithMaskingColors (image,
                                        myMaskingColors);
CGContextDrawImage (context, myContextRect, myColorMaskedImage);

画像をカラーでマスクするを参照してください

于 2012-04-30T15:18:25.697 に答える