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);
}
Uhmm, ¿qué son los niveles automáticos? – vodkhang
"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. –
Esto parece prometedor: http://code.google.com/p/simple-iphone-image-processing/ –