UIImage - реализация алгоритма автоуровня - PullRequest
7 голосов
/ 19 июля 2010

Я хотел бы реализовать опцию "автоматических уровней" для UIImage, который я отображаю в своем приложении для iPhone.Прежде чем я попытался реализовать это сам, мне было интересно, есть ли какие-либо методы обработки изображений в API, которые я должен использовать, для гистограмм и т. Д. Или я должен просто взять базовый CGImage и обработать его?(Я новичок в iPhone.)

Спасибо

MV

Ответы [ 4 ]

7 голосов
/ 22 июля 2010

Одним из очень простых подходов является использование массива декодирования 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 голос
/ 17 декабря 2011

Это очень хорошо объясняет автоуровни (т. Е. Выравнивание гистограммы):

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

У них тоже есть реализация Java того же.

1 голос
/ 19 июля 2010

Я не думаю, что существуют существующие API для обработки изображений, но я уверен, что есть сторонние библиотеки.

0 голосов
/ 25 июля 2010

Вы можете попробовать библиотеку CImg ... У них есть гистограмма и функции выравнивания в документах .Функция equize () имеет довольно приличные результаты из образца изображения.Лицензия LGPL, которая может не подходить для вашего проекта, но совместима с продажей в магазине приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...