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);
}
Euh, qu'est-ce que les niveaux automatiques? – vodkhang
"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. –
Cela semble prometteur: http://code.google.com/p/simple-iphone-image-processing/ –