Преобразование изображения RGB в 1-канальное изображение (черно-белое)

Как преобразовать изображение RGB в 1-канальное изображение (черно-белое) с помощью ios5?

Входное изображение обычно представляет собой фотографию страницы книги. Цель состоит в том, чтобы уменьшить размер фотокопии, преобразовав ее в одноканальное изображение.


person Le_Coeur    schedule 27.03.2013    source источник
comment
Возможный дубликат: stackoverflow.com/questions/1298867/convert-image-to -оттенки серого   -  person Attila H    schedule 27.03.2013
comment
Оттенки серого - это не совсем черно-белое изображение. Мне нужно только два значения на пиксель в матрице выходного изображения, а не 256   -  person Le_Coeur    schedule 27.03.2013
comment
AFAIK, оттенки серого - это одноканальное изображение (тоже). Вам следовало более точно сформулировать вопрос.   -  person Attila H    schedule 27.03.2013
comment
Да, вы правы, поэтому я упомянул черный / белый, а не оттенки серого :) Но, может быть, это немного двусмысленно, спасибо!   -  person Le_Coeur    schedule 27.03.2013


Ответы (3)


Если я понимаю ваш вопрос, вы хотите применить к изображению черно-белое пороговое значение на основе яркости пикселя. Чтобы быстро сделать это, вы можете использовать мой проект с открытым исходным кодом GPUImage (с поддержкой iOS 4. x) и несколько операций обработки изображений, которые он предоставляет.

В частности, GPUImageLuminanceThresholdFilter и GPUImageAdaptiveThresholdFilter могут быть тем, что вы здесь ищете. Первый превращает пиксель в черный или белый в зависимости от установленного порога яркости (по умолчанию 50%). Последний учитывает локальную среднюю яркость при применении этого порога, что может дать лучшие результаты для текста на страницах книги.

Использовать эти фильтры в UIImage довольно просто:

UIImage *inputImage = [UIImage imageNamed:@"book.jpg"];
GPUImageLuminanceThresholdFilter *thresholdFilter = [[GPUImageLuminanceThresholdFilter alloc] init];
UIImage *quickFilteredImage = [thresholdFilter imageByFilteringImage:inputImage];

Их также можно применить к прямой трансляции с камеры и к фотографиям, сделанным камерой.

person Brad Larson    schedule 27.03.2013
comment
Отлично! Спасибо! - person Aaron Bratcher; 11.07.2014

Вы можете использовать Core Image для преобразования изображения в черно-белое.

используйте CIEdgeWork, это превратит ваше изображение в черно-белое

для получения дополнительной информации о программировании основных изображений посетите: - https://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF101

Код, который вы ищете, вероятно, следующий:

CIContext *context = [CIContext contextWithOptions:nil]; // 1
CIImage *image = [CIImage imageWithContentsOfURL:myURL]; // 2
CIFilter *filter = [CIFilter filterWithName:@"CIEdgeWork"]; // 3
[filter setValue:image forKey:kCIInputImgeKey];
[filter setValue:[NSNumber numberWithFloat:0.8f] forKey:@"InputIntensity"];
CIImage *result = [filter valueForKey:kCIOutputImageKey]; // 4
CGImageRef cgImage = [context createCGImage:result fromRect:[result extent];
person Burhanuddin Sunelwala    schedule 27.03.2013
comment
CIEdgeWork обнаруживает края, а не черно-белое пороговое значение, и недоступен в iOS 5.x: stackoverflow.com/a/11820675/19679 < / а> - person Brad Larson; 27.03.2013

вот пример кода, который может быть полезен:

@implementation UIImage (GrayImage)

-(UIImage*)grayImage
{
    int width = self.size.width;
    int height = self.size.height;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGContextRef context = CGBitmapContextCreate
(nil,width,height,8,0,colorSpace,kCGImageAlphaNone);
    CGColorSpaceRelease(colorSpace);

    if (context == NULL) {
        return nil;
    }

    CGContextDrawImage(context,CGRectMake(0, 0, width, height), self.CGImage);
    CGImageRef cgImage = CGBitmapContextCreateImage(context);
    UIImage *grayImage = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);
    CGContextRelease(context);

    return grayImage;
}

@end

Я просто пишу его как категорию UIImage, но не поддерживаю png-изображение с прозрачным пикселем, иначе оно будет черным.

person junkor    schedule 27.03.2013
comment
Черно-белый (1 бит) - это не то же самое, что оттенки серого. - person Aaron Bratcher; 11.07.2014