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);
}
Uhmm, was ist Auto Ebenen? – vodkhang
"Auto Levels" ist eine Option in den meisten Bildbearbeitungsprogrammen wie Photoshop, die den Farbtonbereich des Bildes verbessert. –
Das sieht vielversprechend aus: http://code.google.com/p/simple-iphone-image-processing/ –