2012-04-03 35 views
5

Tôi đang sử dụng tesseract trong ứng dụng iPhone của mình.Chuyển đổi UIImage đen trắng và không phải là thang độ xám để sử dụng tesseract

Tôi đã thử một số bộ lọc trên hình ảnh của mình để chuyển đổi sang hình ảnh thang độ xám, tuy nhiên tôi muốn có kết quả khi ngưỡng được đặt để các pixel duy nhất bên trong hình ảnh có màu đen hoặc trắng.

Tôi đã thành công với việc sử dụng bộ lọc màu xám táo cho kết quả phù hợp. Tuy nhiên nó vẫn là một hình ảnh 16 bit (đúng với tôi nếu tôi sai). Bộ lọc mà tôi đang sử dụng tại thời điểm này như sau:

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

Có thể cung cấp cho tôi bộ lọc để nhận các pixel đen trắng và không phải ảnh xám không?

Trả lời

12

Có lẽ cách nhanh nhất để thực hiện việc này là sử dụng trình đổ bóng OpenGL ES 2.0 để áp dụng ngưỡng cho hình ảnh của bạn. My GPUImage framework đóng gói này để bạn không cần phải lo lắng về các khía cạnh kỹ thuật hơn đằng sau hậu trường.

Sử dụng GPUImage, bạn có thể có được một phiên bản ngưỡng của UIImage của bạn sử dụng một GPUImageLuminanceThresholdFilter và mã như sau:

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

Bạn chỉ có thể vượt qua hình ảnh màu sắc của bạn vào điều này, bởi vì điều này tự động trích xuất các sáng từ mỗi pixel và áp dụng ngưỡng đó. Bất kỳ điểm ảnh nào trên ngưỡng sẽ chuyển sang màu trắng và bất kỳ điểm ảnh nào dưới đây đều có màu đen. Bạn có thể điều chỉnh ngưỡng để đáp ứng các điều kiện cụ thể của mình. Tuy nhiên, một sự lựa chọn thậm chí còn tốt hơn cho một cái gì đó bạn sẽ vượt qua vào Tesseract sẽ là GPUImageAdaptiveThresholdFilter của tôi, có thể được sử dụng theo cùng cách với GPUImageLuminanceThresholdFilter, chỉ không có giá trị ngưỡng. Các thresholding thích ứng làm một hoạt động thresholding dựa trên một khu vực 9 pixel xung quanh điểm ảnh hiện tại, điều chỉnh cho điều kiện ánh sáng địa phương. Điều này được thiết kế đặc biệt để trợ giúp với các ứng dụng OCR, vì vậy nó có thể là cách để đi đến đây.

Ví dụ hình ảnh từ cả hai loại bộ lọc có thể được tìm thấy trong this answer.

Lưu ý rằng vòng qua UIImage chậm hơn xử lý dữ liệu thô, vì vậy các bộ lọc này nhanh hơn nhiều khi hoạt động trên các nguồn phim hoặc video trực tiếp và có thể chạy trong thời gian thực cho các đầu vào đó. Tôi cũng có đầu ra dữ liệu pixel thô, có thể nhanh hơn để sử dụng với Tesseract.

+0

Cảm ơn rất nhiều điều này có vẻ đầy hứa hẹn. Bạn có biết nếu ai đó đã thành công với việc sử dụng khung công tác terrimact và GPUImage? Tôi thấy khó kết hợp tesseract với các khung công tác khác (đặc biệt là thực tế là tesseract có các tệp .mm). Nếu bạn có thể tìm thấy tôi bất kỳ ví dụ, đầu mối ... của họ chào đón nhất – BarryK88

+0

Không nên có bất kỳ không tương thích (không gian tên, vv) mà tôi biết. Tôi biết rằng những người khác đã nói rằng họ sẽ sử dụng điều này với Tesseract, vì vậy kể từ khi họ đã không phàn nàn tôi đoán nó làm việc cho đến nay. Thật không may, tôi không có bất kỳ ví dụ bởi vì tôi chưa thử nghiệm với bản thân mình. –

+0

Tôi đã thử nhập khung của bạn nhưng không thể sửa nó. Tôi đã thêm dự án, đặt phụ thuộc, nhập tệp .a để liên kết thư viện trong cài đặt xây dựng, thêm tiêu đề vào tệp .m nhưng tôi nhận được lỗi này "*** Lỗi xác nhận trong - [GPUImageGrayscaleFilter createFilterFBOofSize:],/Users//Máy tính để bàn/OCR crap/Nieuw/Lưu trữ 2/GPUImageFilter.m: 218 ". Bạn có thể giúp tôi không? – BarryK88

Các vấn đề liên quan