2010-07-19 7 views
7

Me gustaría implementar una opción de "niveles automáticos" para un UIImage que estoy mostrando en mi aplicación de iPhone. Antes de intentar implementarlo yo mismo, me preguntaba si hay algún método de procesamiento de imágenes en las API que debería usar, para histogramas, etc. ¿O debería simplemente tomar la imagen CGImage subyacente y procesarla? (Soy nuevo en el iPhone dev.)UIImage: implementación de un algoritmo de niveles automático

Gracias

MV

+0

Uhmm, ¿qué son los niveles automáticos? – vodkhang

+0

"Niveles automáticos" es una opción en la mayoría de los programas de edición de imágenes como Photoshop que mejora el rango tonal de la imagen. –

+0

Esto parece prometedor: http://code.google.com/p/simple-iphone-image-processing/ –

Respuesta

7

Un enfoque muy fácil es utilizar la matriz de decodificación de un CGImageRef, pero esto es sólo puede ayudar para una asignación de rango (sin 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) 
           ); 

Dónde punto blanco es un líquido de inmersión entre 0,0 y 1.0, que determina qué brillo mapeará a blanco puro en la salida, y blackPoint también es un flotante, que determina qué brillo se asigna a negro puro.

Los elementos de la matriz de decodificación corresponden a los componentes del espacio de color, por lo que este código solo funcionará para las imágenes RBG. Puede configurar los componentes en diferentes valores de blanco y negro para crear una corrección de color simple.

se puede calcular el punto blanco y el punto negro con la siguiente función (w/o corrección de color):

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

No creo que hay API existentes que realizan el procesamiento de imágenes, pero estoy seguro de que hay bibliotecas de terceros por ahí .

0

Usted podría intentar la biblioteca CImg ... Tienen histogram y equalize funciones en la docs. La función de ecualización() tiene resultados bastante buenos, a partir de la imagen de muestra. La licencia es LGPL, que puede no ser adecuada para su proyecto, pero es compatible con la venta en la tienda de aplicaciones.

Cuestiones relacionadas