Как определить цвет кожи лица по исходному изображению в ios 5?

Мне нужно покрасить кожу лица... Как найти цвет кожи?

теперь я получаю цвет кожи по значению пикселя RGB ... Тем не менее я сталкиваюсь с проблемой, я сопоставлял координаты цвета, чтобы они соответствовали коже в определенном цветовом диапазоне ... но все же некоторая область лица не попадает в мой диапазон цветов, значит, это не цвет этой области..

кроме области лица может выпадать эта область, эта область тоже окрашена...

Любая идея о моей проблеме...

Заранее спасибо....

МОЙ код:

    -(void)colorImageBySliderValue:(float)value WithImage:(UIImage*)needToModified
{

    CGContextRef ctx;

    CGImageRef imageRef = needToModified.CGImage;
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char *rawData = malloc(self.sourceImage.image.size.height * self.sourceImage.image.size.width * 10);
    NSUInteger bytesPerPixel = 4;
    NSUInteger bytesPerRow = bytesPerPixel * self.sourceImage.image.size.width;
    NSUInteger bitsPerComponent = 8;
    CGContextRef context1 = CGBitmapContextCreate(rawData, self.sourceImage.image.size.width, self.sourceImage.image.size.height,
                                                  bitsPerComponent, bytesPerRow, colorSpace,
                                                  kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);

    CGContextDrawImage(context1, CGRectMake(0, 0, self.sourceImage.image.size.width, self.sourceImage.image.size.height), imageRef);

    NSLog(@"%d::%d",width,height);


    for(int ii = 0 ; ii < 768 * 1024 ; ii+=4)
    {

        int  R = rawData[ii];
        int G = rawData[ii+1];
        int B = rawData[ii+2];

        //        NSLog(@"%d   %d   %d", R, G, B);
             if( ( (R>60)&&(R<237) ) || ((G>10)&&(G<120))||((B>4) && (B<120)))
//        if( ( (R>100)&&(R<186) ) || ((G>56)&&(G<130))||((B>30) && (B<120)))
//        if( ( (R>188)&&(R<228) ) || ((G>123)&&(G<163))||((B>85) && (B<125)))
            //        if( ( (R>95)&&(R<220) ) || ((G>40)&&(G<210))||((B>20) && (B<170)))
        {


            rawData[ii+1]=R;//13; 
            rawData[ii+2]=G;//43; 
            rawData[ii+3]=value;//63
            //            NSLog(@"entered");
        }
    }


    ctx = CGBitmapContextCreate(rawData,
                                CGImageGetWidth( imageRef ),
                                CGImageGetHeight( imageRef ),
                                8,
                                CGImageGetBytesPerRow( imageRef ),
                                CGImageGetColorSpace( imageRef ),
                                kCGImageAlphaPremultipliedLast ); 

    imageRef = CGBitmapContextCreateImage(ctx);
    UIImage* rawImage = [UIImage imageWithCGImage:imageRef]; 
    UIImageView *ty=[[UIImageView alloc]initWithFrame:CGRectMake(100, 200, 400, 400)];
    ty.image=rawImage;
    [self.view addSubview:ty];
    CGContextRelease(context1);
    CGContextRelease(ctx);  
    free(rawData);   
}

С уважением,

Шпион

Мое выходное изображение...

Другой образец


person Arun    schedule 09.05.2012    source источник


Ответы (1)


вы можете создать два изображения, одно из которых является исходным изображением, а другое - только измененными пикселями изображения, и исправить это... и наложить изображения, добавив сначала исходное изображение, а измененный пиксель - только поверх оригинала....

  for (int index=0; index<length; index+=4) 
        {
            if (data2[index]==data1[index])
            {
                data1[index]=data2[index];
                data1[index+1]=data2[index+1];//aRed+value;//aRed;//13; 
                data1[index+2]=data2[index+2];//aGreen;//aGreen;//43; 
                data1[index+3]=data2[index+3];
            }
person Community    schedule 18.05.2012