画像からテキストを抽出したいなと思い、指定URLの画像を全て保存し、画像から文字抽出するプログラムを作成しました。
pythonを使用して作成しました。
PythonでOCRを参考にしました。
目次
pythonと必要なライブラリなどのインストール
Windowsしか手元にないので、Windowsのみの方法を記述してきます。
python
pythonのインストールは下記ブログを参考にしました。
Pythonのインストール方法[Windows]
Windowsはpathを通すのが面倒だったりするんですが、チェックを忘れずに入れておけば問題なく動くようになりました。
tesseract
OCRツールであるtesseractを入れます。
https://github.com/tesseract-ocr/tesseract/wikiにアクセスします。
最新の4.0.0をクリックします。
3.02の方がインストールすればいいので楽なのですが、文字の解読性があまりにも悪かったので、最新版をインストールしました。
Windows Installer made with MinGW-w64 をクリックします。
ダウンロードしたexeファイルを実行してインストールします。
インストールはデフォルト設定のまま「Next」ボタンをクリックすればOKですが、下記画面の際に「Additional language data (download)」のプラスボタンをクリックし、「Japanise」にチェックを入れます。
インストール後、”C:\Program Files (x86)\Tesseract-OCR”をPathに追加します。
環境変数設定画面を開きます。
開き方は2通りあります。
・Cortana(コルタナ)の検索窓に[コントロールパネル]と入力して、[システムとセキュリティ]→[システム]→[システムの詳細設定]をクリックする。
・[windowsキー+r→sysdm.cplと入力]→[詳細設定タブ]→[環境変数]
システム環境変数内にある[Path]を選択した状態で[編集]をクリックします。
新規で下記を追加します。
C:\Program Files (x86)\Tesseract-OCR
インストール時に「Additional language data (download)」の「Japanise」のチェックを入れ忘れた場合は、日本語の文字解読ができるようにhttps://github.com/tesseract-ocr/tesseract/wiki/Data-Filesからjpnをダウンロードします。
ダウンロードしたjpn.traineddataファイルを C:\Program Files (x86)\Tesseract-OCR\tessdata\ に格納します。
pythonのライブラリ
今回のプログラムで必要なpythonのライブラリをインストールします。
コマンドプロンプトで下記を実行してください。
pyocr
pip install pyocr
requests
pip install requests
beautifulsoup4
pip install beautifulsoup4
lxml
pip install lxml
pythonで実行するプログラム本体
imgCollect.pyというファイル名で作成しました。
# パラメータ:フォルダ名 URL import sys,os import requests # urlを読み込むためrequestsをインポート from bs4 import BeautifulSoup # htmlを読み込むためBeautifulSoupをインポート from PIL import Image import pyocr import pyocr.builders #パラメータ取得 args = sys.argv URL = args[2] # URL入力 images = [] # 画像リストの配列 soup = BeautifulSoup(requests.get(URL).content,'lxml') # bsでURL内を解析 for link in soup.find_all("img"): # imgタグを取得しlinkに格納 if link.get("src").endswith(".jpg"): # imgタグ内の.jpgであるsrcタグを取得 images.append(link.get("src")) # imagesリストに格納・相対パスの場合は各サイトごとに微調整必要 elif link.get("src").endswith(".png"): # imgタグ内の.pngであるsrcタグを取得 images.append(link.get("src")) # imagesリストに格納・相対パスの場合は各サイトごとに微調整必要 #フォルダ作成 folder = args[1] + "/" os.mkdir(folder) file_name = [] # 画像リストの配列 for target in images: # imagesからtargetに入れる re = requests.get(target) with open(folder + target.split('/')[-1], 'wb') as f: # imgフォルダに格納 file_name.append(target.split('/')[-1]) f.write(re.content) # .contentにて画像データとして書き込む tools = pyocr.get_available_tools() if len(tools) == 0: print("No OCR tool found") sys.exit(1) tool = tools[0] print("Will use tool '%s'" % (tool.get_name())) langs = tool.get_available_languages() print("Available languages: %s" % ", ".join(langs)) for imgFile in file_name: # file_nameからimgFileに入れる txt = tool.image_to_string( Image.open(folder + imgFile), lang='jpn', builder=pyocr.builders.TextBuilder(tesseract_layout=6) ) #print(txt) name, ext = os.path.splitext(imgFile) textfile = open(folder + name +'.txt', 'w') textfile.write(txt.replace(' ', '')) print("ok") # 確認
実行コマンド
コマンドプロンプトからpythonを実行します。
cd の後のフォルダは、pythonプログラム本体「imgCollect.py」を格納しているフォルダを指定します。
python imgCollect.py フォルダ名 画像解読したいURL を指定します。
cd C:\Users\ユーザー名\Desktop\test python imgCollect.py img https://retrobanner.net/
実行できましたが、漢字がうまく認識できず、あまり現実的ではありませんでした。残念。