2012-04-03 5 views
5

私のiPhoneアプリケーションではtesseractを使用しています。tesseractを使用するためにUIImageをblack'nに変換し、グレースケールではない

イメージにグレースケールイメージに変換するためにいくつかのフィルタを試しましたが、イメージ内にある唯一のピクセルが黒または白になるようにしきい値が設定されている結果があります。

適切な結果を与えるリンゴグレースケールフィルタを使用することに成功しました。しかし、それはまだ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; 
} 

誰もが純粋な黒と白のピクセルではなくグレースケール画像を取得するためのフィルタを私に提供することはできますか?

答えて

12

これを行う最も簡単な方法は、OpenGL ES 2.0シェーダを使用して画像にしきい値を適用することです。私のGPUImageフレームワークはこれをカプセル化しているため、舞台裏のより技術的な側面について心配する必要はありません。これは、自動的にそれぞれから輝度を抽出しているため

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

あなたは、このにあなたのカラー画像を渡すことができます。GPUImageを使用して

は、次のようなGPUImageLuminanceThresholdFilterとコードを使用して、あなたのUIImageの閾値化バージョンを得ることができましたその閾値を適用する。しきい値を超えるピクセルはすべて白になり、その下のピクセルは黒になります。特定の条件を満たすようにしきい値を調整することができます。

しかし、あなたがTesseractに渡す予定のものは、私のGPUImageAdaptiveThresholdFilterです。これは、GPUImageLuminanceThresholdFilterと同じ方法で、しきい値なしでしか使用できません。適応型閾値処理は、現在のピクセルの周りの9ピクセル領域に基づく閾値処理を行い、局所的な照明条件に対して調整する。これは、OCRアプリケーションを支援するように特別に設計されているため、ここに行く方法かもしれません。

両方のタイプのフィルタの例は、this answerにあります。

UIImageのラウンドトリップは生データを処理するよりも遅いので、これらのフィルタは直接のビデオまたはムービーソースで動作する場合には非常に高速で、これらの入力に対してはリアルタイムで実行できます。私はまた、生のピクセルデータ出力を持っています。これはTesseractで使用する方が高速かもしれません。

+0

ありがとう、これは本当に有望そうです。誰かがterreractとGPUImageフレームワークを使用して成功したかどうか知っていますか?私はtesseractを他のフレームワーク(特にtesseractに.mmファイルがあるという事実)と組み合わせるのは難しいと思っています。あなたが私に事例を見つけることができたら、手がかり...彼らの最も歓迎します。 – BarryK88

+0

私が知っている非互換性(名前空間など)はありません。私は他の人がTesseractでこれを使うと言っていることを知っています。だから、彼らはそれが今まで働いていたと私は推測していません。残念ながら、私はまだこれを自分で実験していないので、例はありません。 –

+0

フレームワークをインポートしようとしましたが、修正できません。プロジェクトを追加し、依存関係を設定し、.aファイルをビルド設定でリンクライブラリにインポートし、.mファイルにヘッダを追加しましたが、このエラーが発生します。 "***アサーションエラー - [GPUImageGrayscaleFilter createFilterFBOofSize:]、/ Users/ /デスクトップ/ OCRクラップ/ Nieuw /アーカイブ2/GPUImageFilter.m:218 "あなたは私を助けることができます? – BarryK88

関連する問題