UIImage - 实现自动级别算法

时间:2010-07-19 05:02:32

标签: iphone algorithm image-processing

我想为我在iPhone应用程序中显示的UIImage实现“自动关卡”选项。在我尝试自己实现它之前,我想知道我应该使用的API中是否有任何图像处理方法,直方图等。或者我应该抓住底层CGImage并处理它? (我是iPhone开发新手。)

由于

MV

4 个答案:

答案 0 :(得分:7)

一种非常简单的方法是使用CGImageRef的解码数组,但这只能用于范围映射(无伽玛等)

    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)
                                );

其中whitePoint是介于0.0和1.0之间的浮点数,用于确定哪个亮度将在输出中映射到纯白色,而blackPoint也是一个浮点数,用于确定哪个亮度映射到纯黑色。

解码数组的元素对应于颜色空间的组件,因此该代码仅适用于RBG图像。您可以将组件设置为不同的白色和黑色值,以创建简单的色彩校正。

您可以使用以下功能(无色彩校正)计算whitePoint和blackPoint:

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 :(得分:1)

我认为现有的API不会进行图像处理,但我确信还有第三方库。

答案 2 :(得分:1)

这很好地解释了自动水平(即直方图均衡):

http://www.generation5.org/content/2004/histogramEqualization.asp

他们也有Java实现。

答案 3 :(得分:0)