UIImage - реализация автоматического алгоритма уровней

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

Спасибо

МВ

7
задан Youngjae 3 March 2014 в 06:12
поделиться

3 ответа

Один очень простой подход - использовать массив декодирования 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);
}
7
ответ дан 7 December 2019 в 03:10
поделиться

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

1
ответ дан 7 December 2019 в 03:10
поделиться

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

0
ответ дан 7 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: