2012-04-03 7 views
5

Я использую tesseract в своем приложении для iPhone.Преобразование UIImage black'n белый, а не оттенки серого для использования tesseract

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

Мне удалось использовать фильтр оттенков серого, который дает соответствующий результат. Однако это еще 16-битное изображение (исправьте меня, если я ошибаюсь). Фильтрации, который я использую в настоящее время выглядит следующим образом:

- (UIImage *) grayishImage:(UIImage *)i { 

    // Create a graphic context. 
    UIGraphicsBeginImageContextWithOptions(i.size, YES, 1.0); 
    CGRect imageRect = CGRectMake(0, 0, i.size.width, i.size.height); 
// Draw the image with the luminosity blend mode. 
[i drawInRect:imageRect blendMode:kCGBlendModeLuminosity alpha:1.0]; 
    // Get the resulting image. 
    UIImage *filteredImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return filteredImage; 
} 

Может кто-нибудь поставить меня с фильтром, чтобы получить чистые черные и белые пиксели, а не черно-белые изображения?

ответ

12

Возможно, самый быстрый способ сделать это - использовать шейдеры OpenGL ES 2.0, чтобы применить порог к вашему изображению. Моя инфраструктура GPUImage инкапсулирует это, так что вам не нужно беспокоиться о более технических аспектах за кулисами.

Используя GPUImage, вы можете получить пороговую версию UIImage используя GPUImageLuminanceThresholdFilter и код вроде следующего:

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; 
GPUImageLuminanceThresholdFilter *stillImageFilter = [[GPUImageLuminanceThresholdFilter alloc] init]; 
stillImageFilter.threshold = 0.5; 
[stillImageSource addTarget:stillImageFilter]; 
[stillImageFilter useNextFrameForImageCapture]; 
[stillImageSource processImage]; 

UIImage *imageWithAppliedThreshold = [stillImageFilter imageFromCurrentFramebuffer]; 

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

Однако, даже лучший выбор для чего-то, что вы собираетесь передать в Tesseract, будет моим GPUImageAdaptiveThresholdFilter, который может использоваться так же, как и GPUImageLuminanceThresholdFilter, только без порогового значения. Адаптивное пороговое значение выполняет операцию порога, основанную на области 9 пикселей вокруг текущего пикселя, приспосабливаясь к местным условиям освещения. Это специально разработано, чтобы помочь с приложениями OCR, так что это может быть путь сюда.

Примеры изображений из обоих типов фильтров можно найти в this answer.

Обратите внимание, что перемещение по каналу через UIImage происходит медленнее, чем обработка необработанных данных, поэтому эти фильтры намного быстрее, когда они воздействуют на прямые источники видео или видео, и могут запускаться в реальном времени для этих входов. У меня также есть исходный вывод данных пикселей, который может быть быстрее для использования с Tesseract.

+0

Большое спасибо, это выглядит реально перспективным. Знаете ли вы, удалось ли кому-то с использованием terreract и рамки GPUImage? Мне сложно сочетать tesseract с другими фреймворками (особенно тот факт, что tesseract имеет .mm-файлы). Если бы вы могли найти мне какие-нибудь примеры, подсказки ... их наиболее приветствуются – BarryK88

+0

Не должно быть никаких несовместимостей (пространство имен и т. Д.), О которых я знаю. Я знаю, что другие люди говорили, что они будут использовать это с Tesseract, поэтому, поскольку они не жаловались, я думаю, что он работает до сих пор. К сожалению, у меня нет примеров, потому что я еще не экспериментировал с этим сам. –

+0

Я пробовал импортировать фреймворк, но не могу исправить его. Я добавил проект, установил зависимость, импортировал файл .a, чтобы связать библиотеку с настройками сборки, добавил заголовок в мой файл .m, но я получаю эту ошибку «*** Ошибка утверждения в [GPUImageGrayscaleFilter createFilterFBOofSize:],/Users//Рабочий стол/OCR дерьмо/Nieuw/Архив 2/GPUImageFilter.m: 218 ". Можете ли вы мне помочь? – BarryK88