私は常に明確に前処理されているこれらの価格ラベルのテキストを検出しようとしています。上に書かれたテキストは簡単に読むことができますが、価格の値を検出できません。 python bindings pytesseract を使用していますが、CLIコマンドからの読み取りも失敗します。ほとんどの場合、価格が1つまたは2つの部分を認識しようとします文字。
サンプル1:
tesseract D:\tesseract\tesseract_test_images\test.png output
そして、サンプル画像の出力はこれです。
je Beutel
13
ただし、価格を切り取って拡大し、それらが分離されて同じフォントサイズであるように見える場合、出力は問題ありません。
処理された画像(トリミングされた価格と縮小された価格):
je Beutel
1,89
多くの類似画像を検討するため、OCR tesseractを意図したとおりに機能させるにはどうすればよいですか? 編集:価格タグを追加しました:
sample5sample6sample7
問題は、Tesseractエンジンがこの種のテキストトポロジを読み取るように訓練されていないことです。
あなたはできる:
一般に、コンピュータービジョンアルゴリズム(CNNを含む)は、画像(機能または記述子)のより高い表現を持つツールを提供しますが、特定の方法で中間結果を処理するためのロジックまたはアルゴリズムを作成できません。
あなたの場合には:
問題は、トレーニングを通してそれを達成することは難しいことであると同時に、人間のためにアルゴリズムとしてこれを書くことは非常に簡単です。実際の実装を提供していないことで申し訳ありませんが、私のテキストは擬似コードです。
問題は、使用している画像のサイズが小さいことです。 tesseractが画像を処理するとき、「8」、「9」を考慮します'および'、 'は単一の文字であるため、'3」または「8」および「、」を1つの文字と「9」を別の文字として使用すると、誤った出力が生成されます。以下に示す画像はそれを説明しています。
簡単な解決策は、元の画像のサイズに応じてサイズを2倍または3倍またはさらに大きくし、次に示すように各文字を個別に検出するようにtesseractに渡すことです。 (ここでサイズを2倍に増やしました)
Bellowはシンプルなpython目的を解決するスクリプトです
import pytesseract
import cv2
img = cv2.imread('dKC6k.png')
img = cv2.resize(img, None, fx=2, fy=2)
data = pytesseract.image_to_string(img)
print(data)
検出されたテキスト:
je Beutel
89
1.
これで、必要なデータをテキストから簡単に抽出し、要件に従ってフォーマットできます。
data = data.replace('\n\n', '\n')
data = data.split('\n')
dollars = data[2].strip(',').strip('.')
cents = data[1]
print('{}.{}'.format(dollars, cents))
望ましい形式:
1.89