2010-07-19 5 views
7

Ich möchte eine "Auto-Ebenen" -Option für eine UIImage implementieren, die ich in meiner iPhone App anzeigen. Bevor ich versuche, es selbst zu implementieren, frage ich mich, ob es irgendwelche Bildverarbeitungsmethoden in den APIs gibt, die ich verwenden soll, für Histogramme usw. Oder sollte ich einfach das zugrunde liegende CGImage greifen und es verarbeiten? (Ich bin neu in iPhone dev.)UIImage - Implementieren eines Auto-Level-Algorithmus

Dank

MV

+0

Uhmm, was ist Auto Ebenen? – vodkhang

+0

"Auto Levels" ist eine Option in den meisten Bildbearbeitungsprogrammen wie Photoshop, die den Farbtonbereich des Bildes verbessert. –

+0

Das sieht vielversprechend aus: http://code.google.com/p/simple-iphone-image-processing/ –

Antwort

7

Eine sehr einfache Vorgehensweise ist es, die Dekodierungsanordnung einer CGImageRef zu verwenden, aber das ist nur für einen Bereich Mapping helfen (ohne Gamma, usw.)

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) 
           ); 

Wo Weißtons ist ein Schwimmer zwischen 0,0 und 1.0, bestimmt, welche Helligkeit in der Ausgabe auf reines Weiß abgebildet wird, und blackPoint ist ebenfalls ein Float, der bestimmt, welche Helligkeit auf reines Schwarz abgebildet wird.

Die Elemente des Dekodier-Arrays entsprechen den Komponenten des Farbraums, daher funktioniert dieser Code nur für RBG-Bilder. Sie können die Komponenten auf verschiedene Weiß- und Schwarzwerte einstellen, um eine einfache Farbkorrektur zu erstellen.

Sie können den Weißpunkt und den Schwarzpunkt mit der folgenden Funktion berechnen (w/o Farbkorrektur):

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

Ich glaube nicht, dass es bestehende APIs, die Bildverarbeitung zu tun, aber ich bin sicher, es gibt Bibliotheken von Drittanbietern gibt, .

0

Sie die CImg Bibliothek versuchen könnten ... Sie haben histogram und equalize Funktionen auf den docs. Die Funktion equalize() hat ziemlich gute Ergebnisse vom Beispielbild. Die Lizenz ist LGPL, die möglicherweise nicht für Ihr Projekt geeignet ist, aber mit dem Verkauf im App Store kompatibel ist.