2010-07-19 3 views
7

Je voudrais implémenter une option "niveaux automatiques" pour un UIImage que j'affiche dans mon application iPhone. Avant d'essayer de l'implémenter moi-même, je me demandais s'il y avait des méthodes de traitement d'image dans les API que je devrais utiliser, pour les histogrammes, etc. Ou devrais-je simplement saisir l'image CG sous-jacente et la traiter? (Je suis nouveau dev iPhone.)UIImage - implémenter un algorithme de niveaux automatiques

Merci

MV

+0

Euh, qu'est-ce que les niveaux automatiques? – vodkhang

+0

"Auto Levels" est une option dans la plupart des programmes d'édition d'image comme Photoshop qui améliore la gamme de tons de l'image. –

+0

Cela semble prometteur: http://code.google.com/p/simple-iphone-image-processing/ –

Répondre

7

Une approche très simple est d'utiliser le tableau de décodage d'un CGImageRef, mais ce n'est peut aider à une cartographie de gamme (pas gamma, etc.)

const CGFloat decode[6] = {blackPoint,whitePoint,blackPoint,whitePoint,blackPoint,whitePoint}; 

    decodedImage = CGImageCreate(CGImageGetWidth(origImage), 
           CGImageGetHeight(origImage), 
           CGImageGetBitsPerComponent(origImage), 
           CGImageGetBitsPerPixel(origImage), 
           CGImageGetBytesPerRow(origImage), 
           CGImageGetColorSpace(origImage), 
           CGImageGetBitmapInfo(origImage), 
           CGImageGetDataProvider(origImage), 
           decode, 
           YES, 
           CGImageGetRenderingIntent(origImage) 
           ); 

Où point blanc est un flotteur entre 0,0 et 1.0, qui détermine quelle luminosité sera mappée en blanc pur dans la sortie, et blackPoint est également un flottant, qui détermine quelle luminosité est mappée en noir pur.

Les éléments de la matrice de décodage correspondent aux composants de l'espace colorimétrique. Ce code ne fonctionnera donc que pour les images RBG. Vous pouvez définir les composants sur différentes valeurs de blanc et de noir pour créer une simple correction de couleur.

Vous pouvez calculer le et mouchetés point blanc avec la fonction suivante (w/o correction des couleurs):

void CalculateAutocorretionValues(CGImageRef image, CGFloat *whitePoint, CGFloat *blackPoint) { 
    UInt8* imageData = malloc(100 * 100 * 4); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef ctx = CGBitmapContextCreate(imageData, 100, 100, 8, 4 * 100, colorSpace, kCGImageAlphaNoneSkipLast); 
    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(ctx, CGRectMake(0, 0, 100, 100), image); 

    int histogramm[256]; 
    bzero(histogramm, 256 * sizeof(int)); 

    for (int i = 0; i < 100 * 100 * 4; i += 4) { 
      UInt8 value = (imageData[i] + imageData[i+1] + imageData[i+2])/3; 
      histogramm[value]++; 
    } 

    CGContextRelease(ctx); 
    free(imageData); 

    int black = 0; 
    int counter = 0; 

    // count up to 200 (2%) values from the black side of the histogramm to find the black point 
    while ((counter < 200) && (black < 256)) { 
      counter += histogramm[black]; 
      black ++; 
    } 

    int white = 255; 
    counter = 0; 

    // count up to 200 (2%) values from the white side of the histogramm to find the white point 
    while ((counter < 200) && (white > 0)) { 
      counter += histogramm[white]; 
      white --; 
    } 

    *blackPoint = 0.0 - (black/256.0); 
    *whitePoint = 1.0 + ((255-white)/256.0); 
} 
1

Je ne pense pas qu'il existe des API existantes qui font le traitement d'images, mais je suis sûr qu'il ya des bibliothèques tierces là .

0

Vous pouvez essayer la bibliothèque CImg ... Ils ont histogram et equalize fonctions sur le docs. La fonction equalize() a des résultats assez décents, à partir de l'image échantillon. La licence est LGPL, ce qui peut ne pas convenir à votre projet mais est compatible avec la vente sur l'App Store.

Questions connexes