2012-04-03 10 views
5

Estoy usando tesseract en mi aplicación de iPhone.Convirtiendo un UIImage black'n blanco y no en escala de grises para usar tesseract

Probé varios filtros en mi imagen para convertirla en una imagen en escala de grises; sin embargo, me gustaría tener el resultado donde se establece un umbral para que los únicos píxeles que están dentro de la imagen sean negro o blanco.

Tuve éxito con el uso de un filtro de escala de grises de manzanas que da el resultado apropiado. Sin embargo, sigue siendo una imagen de 16 bits (corrígeme si me equivoco). El filtrado que estoy usando en este momento es como sigue:

- (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; 
} 

¿Alguien puede suministrar con el filtro para obtener píxeles blancos y negros puros y no las imágenes en escala de grises?

Respuesta

12

Probablemente la forma más rápida de hacer esto sería utilizar los sombreadores OpenGL ES 2.0 para aplicar el umbral a su imagen. Mi marco GPUImage encapsula esto para que no tenga que preocuparse por los aspectos más técnicos detrás de las escenas.

Usando GPUImage, se podría obtener una versión de umbral de su UIImage utilizando un GPUImageLuminanceThresholdFilter y código como el siguiente:

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]; 

Usted puede simplemente pasar su imagen en color en esto, porque esto extrae automáticamente la luminancia de cada píxel y aplica el umbral a eso. Cualquier píxel por encima del umbral pasa a blanco, y el que está debajo es negro. Puede ajustar el umbral para cumplir con sus condiciones particulares.

Sin embargo, una opción aún mejor para algo que va a pasar a Tesseract sería mi GPUImageAdaptiveThresholdFilter, que se puede usar de la misma manera que GPUImageLuminanceThresholdFilter, solo que sin un valor de umbral. El umbral adaptativo realiza una operación de umbral basada en una región de 9 píxeles alrededor del píxel actual, ajustándose a las condiciones de iluminación locales. Esto está específicamente diseñado para ayudar con las aplicaciones de OCR, por lo que podría ser la manera de hacerlo aquí.

Ejemplos de imágenes de ambos tipos de filtros se pueden encontrar en this answer.

Tenga en cuenta que la ida y vuelta a través de UIImage es más lenta que la manipulación de datos sin procesar, por lo que estos filtros son mucho más rápidos cuando se utilizan fuentes directas de video o película y pueden ejecutarse en tiempo real para esas entradas. También tengo una salida de datos de píxel sin procesar, que podría ser más rápida para usar con Tesseract.

+0

Muchas gracias, esto parece realmente prometedor. ¿Sabes si alguien tuvo éxito con el uso de terreract y el marco GPUImage? Me resulta difícil combinar Tesseract con otros frameworks (especialmente el hecho de que tesseract tiene archivos .mm). Si pudiera encontrarme algún ejemplo, pistas ... su más bienvenido – BarryK88

+0

No debería haber ninguna incompatibilidad (espacio de nombres, etc.) que yo sepa. Sé que otras personas han dicho que usarían esto con Tesseract, así que, como no se han quejado, supongo que está funcionando hasta el momento. Desafortunadamente, no tengo ningún ejemplo porque todavía no he experimentado con esto. –

+0

He intentado importar su marco pero no puedo arreglarlo. Agregué el proyecto, establecí la dependencia, importé un archivo .a para vincular la biblioteca en la configuración de construcción, agregué un encabezado a mi archivo .m pero recibo este error "*** Error de aserción en - [GPUImageGrayscaleFilter createFilterFBOofSize:],/Users//Desktop/OCR basura/Nieuw/Archive 2/GPUImageFilter.m: 218 ". ¿Me puede ayudar? – BarryK88

Cuestiones relacionadas