Iphone 如何有选择地仅替换图像中的肤色?

Iphone 如何有选择地仅替换图像中的肤色?,iphone,objective-c,ios,image-processing,Iphone,Objective C,Ios,Image Processing,我想把人类皮肤的颜色改成蓝色,就像电影《阿凡达》中那样。我使用以下代码确定肤色像素并替换其颜色: /* 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 > 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;


    }
/*
R>95,G>40,B>20和
max{R,G,B}–min{R,G,B}>15和
|R–G |>15和
R>G和R>B
或
R>220,G>210,B>170和
|R–G | B和G>B*/
如果((红色>95)和(绿色>40)和(蓝色>20)和(红绿>15)和(红色>绿色)和(红色>蓝色))| |((红色>220)和(绿色>210)和(蓝色>170)和(红绿蓝)和(绿色>蓝色))){
数据[i]=255;
数据[i+1]=100-(190红色);
数据[i+2]=200-(190绿色);
数据[i+3]=255;
}
此方法适用于我下载的人脸图像中的白色皮肤:

但当我用相机拍摄一张真实的照片时,它并不是给整个皮肤着色,而是部分:


有没有一种方法可以取代一系列肤色的肤色像素?

不幸的是,完美的皮肤分割是一个尚未解决(或者可能无法解决)的问题。若你们并没有一个包含“太多”像素的要求,那个么你们可以打开你们的阈值,把“更多”的像素涂成蓝色。但是,您将遇到背景像素或衣服像素也会变色的问题。我们已经看到你照片背景中的画是蓝色的,尽管它不是皮肤。在这一点上,我认为您唯一的选择是使用更智能的分割技术(可能是自适应技术)更好地选择肤色像素。

使用石英,您可以创建定义特定颜色范围的图像,以替换为:

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