2012-04-30 61 views
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; 


    } 

此方法對人臉圖像公平的膚色我已經下載運行良好:

enter image description here

但當我需要一個實際的圖片從相機它不是着色整個皮膚,只有部分:

enter image description here

有沒有一種方法可以替換一系列膚色的膚色像素?

回答

2

不幸的是,完美的肌膚分割是一個尚未解決的(或者是無法解決的?!)問題。如果你沒有一個關於包括「太多」的像素,那麼你就可以打開你的閾值,以顏色的像素的「多」與偏藍色調的要求。但是,您會遇到背景像素或衣服像素變色的問題。我們已經看到您的鏡頭背景中的繪畫呈藍色,即使它不是皮膚。在這一點上,我認爲你唯一的選擇是使用一個更聰明的分割技術(可能使用自適應技術)來選擇皮膚顏色的像素更好。

0

使用石英你可以創建一個圖像定義特定的色彩範圍,以取代:

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