質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

画像から文字が抽出できない。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,282

score 21

指定した画像から文字を抽出して、文字認識を行いたいです。
(不必要なimportが混じっていますが、ご容赦願います)

書いているコードだと[tools]が空のため、[No OCR tool found]に繋がってしまいます。
どうすれば、文字抽出に進むことができるでしょうか。

【結果】

1
No OCR tool found

【コード】

    picno = 1
    for i in range(5):
        event_pic = testfld + '/Cut/988-3_no' + str(picno) + '.png'
        print(picno)

        #======================================
        # グレースケール
        mov_in = cv2.imread(event_pic, cv2.IMREAD_GRAYSCALE)    # 画像ファイrの読み込み
        if mov_in is None:
            print('ファイルが読み込めません')
            import sys
            sys.exit()

        cv2.imwrite(testfld + '/mov_in_gray.png', mov_in)
        cv2.waitKey(0)

        #======================================
        # 2値化
        img_gry = (testfld + '/mov_in_gray.png')
        org_img = cv2.imread(img_gry, 0)

        THRESHOLD = 215         # 閾値はNumpyで調べた
        MAXVALUE = 255          # 255 = white

        _, bin_cv2 = cv2.threshold(org_img, THRESHOLD, MAXVALUE, cv2.THRESH_BINARY_INV)
                    # [_INV]で背景白、黒文字にすることができる(Tesseractで読める絶対条件!)

        bin_npy = np.zeros(org_img.shape, org_img.dtype)
        bin_npy[np.where(org_img > THRESHOLD)] = MAXVALUE

        cv2.imwrite(testfld + '/binary_no' +str(picno)+ '.png', bin_cv2)

        #======================================
        # 文字認識
        tools = pyocr.get_available_tools()
        if len(tools) == 0:
            print('No OCR tool found')
            sys.exit()
        tool = tools[0]
##        print("Will use tool '%s'" % (tool.get_name()))

        langs = tool.get_available_languages()
##        print("Availble languages: %s" % ", ".join(langs))
                    # 使用可能言語の確認なので、コメントアウト中
                    # [langs]に入れる略記の確認には使える

        txt = tool.image_to_string(
            Image.open(testfld + '/binary_no' +str(picno)+ '.png'),
            lang = 'eng',
            builder = pyocr.builders.TextBuilder()
        )
        print(txt)
        print('----------------------------')

        if picno == 1:
            ev01 = txt
        elif picno == 2:
            ev02 = txt
        elif picno == 3:
            ev03 = txt
        elif picno == 4:
            ev04 = txt
        elif picno == 5:
            ev05 = txt

        picno = picno + 1

        print('----------------------------')
        print('Event5回取得')
        print('----------------------------')

        text = [ev01, ev02, ev03, ev04, ev05]
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

pyocr はただのラッパーライブラリなので、OCR 本体を別途インストールする必要があります。

Ubuntu であれば、以下のコマンドでインストールできました。
他の OS であれば、Home · tesseract-ocr/tesseract Wiki を見ながら入れてください。

apt-get install -y tesseract-ocr
apt-get install -y libtesseract-dev
# 日本語データをダウンロードして、コピー
wget https://github.com/tesseract-ocr/tessdata/raw/4.00/jpn.traineddata
cp jpn.traineddata /usr/share/tesseract-ocr/tessdata/
import pyocr
from PIL import Image
from pyocr.builders import TextBuilder

tools = pyocr.get_available_tools()
assert len(tools) > 0  # OCR ソフトがインストールされていないといけない

tool = tools[0]
print(tool.get_name())

langs = tool.get_available_languages()
print('Available languages:', ', '.join(langs))

img = Image.open('test.png')
txt = tool.image_to_string(img, lang='jpn',
                           builder=TextBuilder(tesseract_layout=6))
print(txt)

デフォルトだと認識精度がいまいちですね。設定等調整すると改善するのかもしれませんが。。。

イメージ説明

馴。" (バイ ソン) は、 柵のプロダラミンケ言語でぁる〟 コードがシンプ
ルで扱ぃやすく設計されてぉり` C言語などに比べて、 さまざまなブロダラム
を分かりゃす〈、 少なぃコー ド行数で書けるとぃった特徴かぁる〟

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る