Преобразование UIImage черного и белого и не в оттенках серого для использования tesseract - PullRequest
5 голосов
/ 03 апреля 2012

Я использую tesseract в своем приложении для iPhone.

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

Мне удалось использовать фильтр оттенков серого яблока, который дает соответствующий результат. Однако это все еще 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;
}

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

1 Ответ

12 голосов
/ 04 апреля 2012

Вероятно, самый быстрый способ сделать это - использовать шейдеры 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, поэтому это может быть путь сюда.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...