2012-04-03 4 views
5

Sto usando tesseract nella mia applicazione iPhone.Conversione di un UIImage black'n bianco e non in scala di grigi per l'utilizzo di tesseract

Ho provato diversi filtri sulla mia immagine per convertirlo in un'immagine in scala di grigi, tuttavia mi piacerebbe avere il risultato in cui viene impostata una soglia in modo che gli unici pixel che si trovano all'interno dell'immagine siano neri o bianchi.

Sono riuscito a utilizzare il filtro mele in scala di grigi che fornisce il risultato appropriato. Comunque è ancora un'immagine a 16 bit (correggimi se sbaglio). Il filtraggio che sto usando in questo momento è la seguente:

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

Qualcuno mi può fornire con il filtro per ottenere pixel bianchi e neri puri e non le immagini in scala di grigi?

risposta

12

Probabilmente il modo più veloce per farlo sarebbe utilizzare gli shader OpenGL ES 2.0 per applicare la soglia all'immagine. Il mio framework GPUImage incapsula questo in modo da non doverti preoccupare degli aspetti più tecnici dietro le quinte.

Utilizzando GPUImage, si potrebbe ottenere una versione thresholded del UIImage utilizzando un GPUImageLuminanceThresholdFilter e codice come il seguente:

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

Si può solo passare l'immagine a colori in questo, perché questo estrae automaticamente la luminanza di ogni pixel e applica la soglia a questo. Qualsiasi pixel sopra la soglia diventa bianco e uno sotto è nero. È possibile regolare la soglia per soddisfare le condizioni particolari.

Tuttavia, una scelta ancora migliore per qualcosa che passi a Tesseract è il mio GPUImageAdaptiveThresholdFilter, che può essere utilizzato nello stesso modo di GPUImageLuminanceThresholdFilter, solo senza un valore di soglia. La soglia adattativa esegue un'operazione di soglia basata su un'area di 9 pixel attorno al pixel corrente, regolando le condizioni di illuminazione locali. Questo è specificamente progettato per aiutare con le applicazioni OCR, quindi potrebbe essere il modo di andare qui.

Esempi di immagini da entrambi i tipi di filtri sono disponibili in this answer.

Si noti che il roundtrip tramite UIImage è più lento rispetto alla gestione dei dati non elaborati, quindi questi filtri sono molto più veloci quando agiscono su sorgenti video o film diretti e possono essere eseguiti in tempo reale per tali input. Ho anche un output di dati di pixel non elaborati, che potrebbe essere più veloce da usare con Tesseract.

+0

Grazie mille questo sembra davvero promettente. Sai se qualcuno è riuscito a utilizzare Terreract e il framework GPUImage? Trovo difficile combinare tesseract con altri framework (specialmente il fatto che tesseract abbia file .mm). Se potessi trovarmi qualche esempio, indizi ... i loro più graditi – BarryK88

+0

Non ci dovrebbero essere incompatibilità (namespace, ecc.) Che io sappia. So che altre persone hanno detto che lo userebbero con Tesseract, quindi dal momento che non si sono lamentati, immagino che stia funzionando finora. Sfortunatamente, non ho esempi perché non ho ancora sperimentato da solo. –

+0

Ho provato a importare il framework ma non riesco a farlo riparare. Ho aggiunto il progetto, impostato la dipendenza, importato un file .a per collegare la libreria nelle impostazioni di creazione, aggiunto l'intestazione al mio file .m ma sto ricevendo questo errore "*** Errore di asserzione in - [GPUImageGrayscaleFilter createFilterFBOofSize:],/Users//Scrivania desktop/OCR/Nuovo/Archivio 2/GPUImageFilter.m: 218 ". Mi puoi aiutare? – BarryK88