Двоичное квантование CGImage (изображение в основном светлое или темное) - PullRequest
1 голос
/ 16 января 2012

У меня есть CGImage, и я хочу определить, является ли он в основном ярким или в основном темным. Конечно, я могу просто пройтись по матрице и посмотреть, превышает ли достаточное количество пикселей желаемый порог. Однако, поскольку я новичок в обработке изображений, я предполагаю, что в CoreGraphics или Quartz должны быть встроенные функции, которые лучше подходят и, возможно, даже ускорены.

Ответы [ 3 ]

2 голосов
/ 16 января 2012

CoreGraphics (он же Quartz 2D) не имеет никаких функций для этого. CoreImage в Mac OS X имеет CIAreaAverage и CIAreaHistogram, что может вам помочь, но я не думаю, что iOS (начиная с 5.0.1) имеет эти фильтры.

iOS имеет Ускорение фреймворка . Функция vImageHistogramCalculation_ARGBFFFF и связанные с ней функции могут вам помочь.

1 голос
/ 24 мая 2015

Вот как использовать CIAreaAverage в приложении для iOS:

    CGRect inputExtent = [self.inputImage extent];
    CIVector *extent = [CIVector vectorWithX:inputExtent.origin.x
                                           Y:inputExtent.origin.y
                                           Z:inputExtent.size.width
                                           W:inputExtent.size.height];
    CIImage* inputAverage = [CIFilter filterWithName:@"CIAreaAverage" keysAndValues:@"inputImage", self.inputImage, @"inputExtent", extent, nil].outputImage;

    //CIImage* inputAverage = [self.inputImage imageByApplyingFilter:@"CIAreaMinimum" withInputParameters:@{@"inputImage" : inputImage, @"inputExtent" : extent}];
    EAGLContext *myEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    NSDictionary *options = @{ kCIContextWorkingColorSpace : [NSNull null] };
    CIContext *myContext = [CIContext contextWithEAGLContext:myEAGLContext options:options];

    size_t rowBytes = 32 ; // ARGB has 4 components
    uint8_t byteBuffer[rowBytes]; // Buffer to render into

    [myContext render:inputAverage toBitmap:byteBuffer rowBytes:rowBytes bounds:[inputAverage extent] format:kCIFormatRGBA8 colorSpace:nil];

    const uint8_t* pixel = &byteBuffer[0];
    float red   = pixel[0] / 255.0;
    float green = pixel[1] / 255.0;
    float blue  = pixel[2] / 255.0;
    NSLog(@"%f, %f, %f\n", red, green, blue);


    return outputImage;
}

@end
0 голосов
/ 07 апреля 2015

Существуют более быстрые и эффективные способы измерения этой конкретной метрики, чем с помощью гистограммы интенсивности - если, фактически, все, что вы намереваетесь делать с ней, это измерения.

Изображение - это другое; оно определяется суммой средних интенсивностей, но не требует их объединения. Значение, возвращаемое формулой ввода изображения (которое у меня есть, если вам нужно), можно использовать для локального адаптивного отображения тонального диапазона (что вам нужно) с помощью простой настройки гаммы (значение интенсивности пикселя, увеличенное на единицу над значение ключа изображения).

Это не сложно, и ясно, что у вас есть навыки и опыт, чтобы использовать этот более быстрый и эффективный способ различения светлого и темного изображения.

Более того, вы должны установить схему и практику использования формул метрики изображения вместо гистограмм везде, где можете. Они предназначены для интерпретации информации, а не просто для ее сбора. И не только это, но они часто совместимы, то есть их можно накладывать друг на друга, как фильтры Core Image.

Подробнее см .:

Гамма-коррекция с адаптацией к ключу изображения, на стр. 14 тонального отображения для изображений с большим динамическим диапазоном, автор Laurence Meylan.

...