2012-04-03 4 views
5

Ich benutze Tesseract in meiner iPhone-Anwendung.Umwandlung eines UIImage black'n weiß und nicht Graustufen für die Verwendung von Tesseract

Ich habe mehrere Filter auf meinem Bild versucht, um es in ein Graustufenbild zu konvertieren, aber ich würde gerne das Ergebnis haben, wo eine Schwelle gesetzt wird, so dass die einzigen Pixel innerhalb des Bildes schwarz oder weiß sind.

Es gelang mir mit Äpfel Graustufenfilter, die das entsprechende Ergebnis gibt. Aber es ist immer noch ein 16-Bit-Bild (korrigiere mich, wenn ich falsch liege). Die Filterung, die ich im Moment ist wie folgt:

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

Kann mir jemand mit dem Filter liefern reinen schwarzen und weißen Pixeln zu bekommen und nicht Graustufen-Bilder?

Antwort

12

Der schnellste Weg, dies zu tun, wäre die Verwendung von OpenGL ES 2.0 Shadern, um den Schwellenwert auf Ihr Bild anzuwenden. Mein GPUImage Framework kapselt dies so ein, dass Sie sich nicht um die technischen Aspekte hinter den Kulissen kümmern müssen.

GPUImage verwenden, könnten Sie eine schwellen Version Ihres UIImage mit einem GPUImageLuminanceThresholdFilter und Code wie folgt erhalten:

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

können Sie passieren nur Ihre Farbbild in diese, weil dies automatisch die Helligkeit von jedem extrahiert Pixel und wendet den Schwellenwert darauf an. Jedes Pixel über dem Schwellenwert wird zu weiß, und ein beliebiges darunter ist schwarz. Sie können den Schwellenwert anpassen, um Ihre speziellen Bedingungen zu erfüllen.

Eine noch bessere Wahl für etwas, das Sie in Tesseract übergeben werden, wäre mein GPUImageAdaptiveThresholdFilter, der auf die gleiche Weise wie der GPUImageLuminanceThresholdFilter verwendet werden kann, nur ohne einen Schwellenwert. Die adaptive Schwellenwertoperation führt eine Schwellenwertoperation basierend auf einem 9-Pixel-Bereich um das aktuelle Pixel herum durch und passt sie an lokale Beleuchtungsbedingungen an. Dies wurde speziell entwickelt, um mit OCR-Anwendungen zu helfen, also könnte es der Weg sein, hier zu gehen.

Beispiele Bilder von beiden Arten von Filtern können in this answer gefunden werden.

Beachten Sie, dass das Roundtrip-Verfahren durch UIImage langsamer ist als die Verarbeitung von Rohdaten. Daher sind diese Filter bei direkten Video- oder Filmquellen viel schneller und können für diese Eingaben in Echtzeit ausgeführt werden. Ich habe auch eine rohe Pixeldatenausgabe, die für die Verwendung mit Tesseract schneller sein könnte.

+0

Vielen Dank das sieht wirklich vielversprechend aus. Weißt du, ob es jemandem gelungen ist, terreract und das GPUImage-Framework zu verwenden? Ich finde es schwierig, tesseract mit anderen Frameworks zu kombinieren (besonders die Tatsache, dass tesseract .mm-Dateien hat). Wenn Sie mir irgendwelche Beispiele, Anhaltspunkte ... finden könnten, wäre ich herzlich willkommen. – BarryK88

+0

Es sollte keine Inkompatibilitäten (Namespace, etc.) geben, die ich kenne. Ich weiß, dass andere Leute gesagt haben, dass sie das mit Tesseract benutzen würden, also da sie sich nicht beschwert haben, schätze ich, dass es soweit funktioniert. Leider habe ich keine Beispiele, weil ich selbst noch nicht damit experimentiert habe. –

+0

Ich habe versucht, Ihr Framework zu importieren, kann es aber nicht beheben. Ich habe das Projekt hinzugefügt, die Abhängigkeit festgelegt, eine .a-Datei in die Link-Bibliothek in den Build-Einstellungen importiert, einen Header zu meiner .m-Datei hinzugefügt, aber ich erhalte diesen Fehler "*** Assertionsfehler in - [GPUImageGrayscaleFilter createFilterFBOofSize:],/Users//Desktop/OCR Mist/Nieuw/Archiv 2/GPUImageFilter.m: 218 ". Kannst du mir helfen? – BarryK88

Verwandte Themen