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

时间:2012-04-30 12:31:27

标签: 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 – 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;


    }

此方法适用于我已下载的脸部图像中的白色皮肤:

enter image description here

但是当我从相机拍摄实际照片时,它并没有为整个皮肤着色,只有部分:

enter image description here

有没有办法为一系列肤色替换肤色像素?

2 个答案:

答案 0 :(得分:2)

不幸的是,完美的皮肤细分是一个未解决的(或者可能无法解决的问题)。如果您没有要求包含“太多”像素,那么您可以打开阈值以使用蓝色色调为“更多”像素着色。但是,您将遇到背景像素或服装像素也会变色的问题。我们已经看到你的镜头背景中的画作是蓝色的,即使它不是皮肤。在那一点上,我认为你唯一的选择是使用更智能的分割技术(可能是一种自适应技术)来更好地选择肤色像素。

答案 1 :(得分:0)

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

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

请参阅Masking an Image with Color