Гистограмма изображения в iPhone - PullRequest
3 голосов
/ 09 августа 2011

Я ищу способ получить гистограмму изображения на iPhone. Библиотека OpenCV слишком велика, чтобы ее можно было включить в мое приложение (скомпилировано около 70 МБ OpenCV), но я могу использовать OpenGL. Тем не менее, я понятия не имею, как это сделать.

Я нашел способ получить пиксели изображения, но не могу сформировать гистограмму. Кажется, это должно быть просто, но я не знаю, как сохранить uint8_t в массиве.

Вот соответствующий вопрос / ответ для поиска пикселей:

Получение данных пикселей RGB из CGImage

Ответы [ 2 ]

0 голосов
/ 14 августа 2016

Вы можете выбрать цвет изображения RGB с помощью CGRef.Посмотрите на метод ниже, который я использовал для этого.

- (UIImage *)processUsingPixels:(UIImage*)inputImage {

// 1. Get the raw pixels of the image
UInt32 * inputPixels;

CGImageRef inputCGImage = [inputImage CGImage];
NSUInteger inputWidth = CGImageGetWidth(inputCGImage);
NSUInteger inputHeight = CGImageGetHeight(inputCGImage);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

NSUInteger bytesPerPixel = 4;
NSUInteger bitsPerComponent = 8;

NSUInteger inputBytesPerRow = bytesPerPixel * inputWidth;

inputPixels = (UInt32 *)calloc(inputHeight * inputWidth, sizeof(UInt32));

CGContextRef context = CGBitmapContextCreate(inputPixels, inputWidth, inputHeight,
                                             bitsPerComponent, inputBytesPerRow, colorSpace,
                                             kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

// 3. Convert the image to Black & White
for (NSUInteger j = 0; j < inputHeight; j++) {
    for (NSUInteger i = 0; i < inputWidth; i++) {
        UInt32 * currentPixel = inputPixels + (j * inputWidth) + i;
        UInt32 color = *currentPixel;

        // Average of RGB = greyscale
        UInt32 averageColor = (R(color) + G(color) + B(color)) / 3.0;

        *currentPixel = RGBAMake(averageColor, averageColor, averageColor, A(color));
    }
}

// 4. Create a new UIImage
CGImageRef newCGImage = CGBitmapContextCreateImage(context);
UIImage * processedImage = [UIImage imageWithCGImage:newCGImage];

// 5. Cleanup!
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);

   return processedImage;
}
0 голосов
/ 09 августа 2011

uint8_t * - это просто указатель на массив c, содержащий байты данного цвета, т. Е. {R, g, b, a} или любой другой формат цветового байта для буфера изображения.

Итак, ссылаясь на предоставленную вами ссылку и определение гистограммы:

//Say we're in the inner loop and we have a given pixel in rgba format
const uint8_t* pixel = &bytes[row * bpr + col * bytes_per_pixel];
//Now save to histogram_counts uint32_t[4] planes r,g,b,a
//or you could just do one for brightness
//If you want to do data besides rgba, use bytes_per_pixel instead of 4
for (int i=0; i<4; i++) {
    //Increment count of pixels with this value
    histogram_counts[i][pixel[i]]++;
}
...