2017-02-11 12 views
3

私は列車やトラックなどの車両のOCRを行い、文字や数字を識別しようとしています。 (これはナンバープレート識別OCRではないことに注意してください)車両に書かれたテキストのOCRを改善するには?

私はこのイメージを取った。アイデアは、BN SF 721 734のテキストを抽出することです。前処理のために

enter image description here

は、私が最初にグレースケールに、この画像を変換してから、私はたTesseractでいくつかのコードを書いたこの

enter image description here

ようになります二値画像に変換しました。

myimg = "image.png" 
image = Image.open(myimg) 
with PyTessBaseAPI() as api: 
    api.SetImage(image) 
    api.Recognize() 
    words = api.GetUTF8Text() 
    print words 
    print api.AllWordConfidences() 

このコードは、私たTesseractは、テキストが、この画像では存在しないことを95%確信していたことを意味し95の信頼値を持つ空白の出力を与えました。

私はTesseractでsetrectangle apiを使用して、画像全体のOCRを行うのではなく、画像内の特定のウィンドウでOCRを制限しました。

myimg = "image.png" 
image = Image.open(myimg) 
with PyTessBaseAPI() as api: 
    api.SetImage(image) 
    api.SetRectangle(665,445,75,40) 
    api.Recognize() 
    words = api.GetUTF8Text() 
    print words 
    print api.AllWordConfidences() 
    print "----" 

座標665,445,75および40は、イメージ内にテキストBNSF 721 734を含む矩形に対応します。665 - 上、445-左、75-幅および40-高さ。

私が得た出力は、このでした:

an s 
m,m 

私の質問はどのように私は結果を改善しないのですか?私はsetrectangle関数の値を使って遊んだが、結果は少しばらつきましたが、それらのすべてが同じように悪いものでした。

これを改善する方法はありますか?あなたは、私が二値化画像に画像を変換する方法に興味がある場合

、私はOpenCVの

img = cv2.imread(image) 
grayscale_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) 
(thresh, im_bw) = cv2.threshold(grayscale_img, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) 
thresh = 127 
binarized_img = cv2.threshold(grayscale_img, thresh, 255, cv2.THRESH_BINARY)[1] 
+0

OpenCVを使用してMSER領域を抽出してみてください。これをTesseractに送ってください –

+0

@JeruLuke:このオプションを試してみましょう。私は彼らが現在どのように働いているのか分からないので、私はMSER地域について読む必要があります。私の質問は、それがOCRの精度を向上させるのに役立つのでしょうか、それとも、テキストの周りに矩形を自動的に抽出するのに役立ちますか?ありがとう – Piyush

+0

ストローク幅変換を使用して、最初に画像内のテキストの位置を特定してみてください。特にテキストを見つけるために設計されています。原則として、あまりに早く2値化するのは避けてください。 – Rethunk

答えて

0

を使用し、私はあなたのトリミングされた四角形で輪郭を見つけ、あなたの文字の輪郭に合わせて、いくつかのパラメータを設定することをお勧めします。例えば、ある面積より大きいか小さい面積の輪郭。空のビットマップに輪郭を描き、OCRを実行します。

私はそれが多くの仕事のように思えますが、それはより良い、より堅牢な結果を提供します。 幸運を祈る!

関連する問題