Một cách tiếp cận rất dễ dàng là sử dụng các mảng giải mã của một CGImageRef, nhưng điều này chỉ có thể giúp cho một bản đồ phạm vi (không gamma vv)
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)
);
đâu Điểm trắng của là một phao giữa 0,0 và 1.0, xác định độ sáng nào sẽ được ánh xạ tới màu trắng tinh khiết trong đầu ra, và blackPoint cũng là một phao, xác định độ sáng nào được ánh xạ tới màu đen thuần túy.
Các phần tử của mảng giải mã tương ứng với các thành phần của không gian màu, vì vậy mã này sẽ chỉ hoạt động đối với hình ảnh RBG. Bạn có thể đặt các thành phần thành các giá trị trắng và đen khác nhau để tạo ra một hiệu chỉnh màu đơn giản.
Bạn có thể tính toán điểm trắng và blackPoint với hàm sau (w/o hiệu chỉnh màu sắc):
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, mức tự động là gì? – vodkhang
"Auto Levels" là một tùy chọn trong hầu hết các chương trình chỉnh sửa hình ảnh như Photoshop giúp cải thiện phạm vi âm của hình ảnh. –
Điều này có vẻ đầy hứa hẹn: http://code.google.com/p/simple-iphone-image-processing/ –