JPEGファイルから文字を抽出する方法

#1 はじめに
Pythonを使って、JPEGファイルから文字を抽出してみます。

#2 環境
VMware Workstation 15 Playerで作成した仮想マシン(1台)を使用しました。
CentOSの版数は下記のとおりです。

```console:CentOS版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
```
カーネル版数は以下のとおりです。

```console:カーネル版数
[root@server ~]# uname -r
4.18.0-240.el8.x86_64
```

#3 パッケージのインストール
まず、仮想マシンにAnacondaをインストールしました。
インストール方法は、[Anacondaのインストール方法](https://qiita.com/hana_shin/items/a65d686d0e611884cef4)を参照してください。

次に、各種パッケージのアップデートを行いました。

```console:アップデート
(base) [root@server ~]# conda update conda
(base) [root@server ~]# conda install anaconda
(base) [root@server ~]# conda update --all
```

次に、tesseract(テッセラクト)をインストールしました。
tesseractは、OCRエンジン(光学式文字認識エンジン)です。
インストール方法は、[https://anaconda.org/conda-forge/tesseract](https://anaconda.org/conda-forge/tesseract)を参照ください。

```console:tesseractのインストール
(base) [root@server ~]# conda install -c conda-forge tesseract
```

最後に、pyocrをインストールしました。
pyocrは、PythonからOCRエンジンを利用可能にするためのモジュールです。
インストール方法は、[https://anaconda.org/conda-forge/pyocr](https://anaconda.org/conda-forge/pyocr)を参照ください。

```console:pyocrのインストール
(base) [root@server ~]# conda install -c conda-forge pyocr
```


#4 PCのディスプレイで採取した画像ファイルから文字列の抽出
##4.1 画像ファイルの作成
テスト用の画像ファイルを作成します。
ここでは、`/var/log/messages`ファイルの先頭30行をJPEGファイルとして保存します。

```console:messagesの先頭30行表示
[root@server ~]# head -n 30 /var/log/messages
```

`/var/log/messages`ファイルの先頭30行のログを表示します。
そして、Ctrl+PrtScを押下して、画面のハードコピーを作成しました。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146813/d22e89b6-abcb-05bb-6672-38cac363ba4a.png)

ペイントを使って、画面のハードコピーをJPEG形式で保存します。
ファイル名は`syslog.jpg`としました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146813/5b6e627d-c34a-6fc3-bc52-1d6dbd0b85e1.png)


##4.2 ソースコード

```console:ソースコード
from PIL import Image
import pyocr

# OCRエンジンを取得
engines = pyocr.get_available_tools()
if len(engines) == 0:
    print("OCR engine not found")
    sys.exit(1)
engine = engines[0]

# 画像の文字を読み込む
txt = engine.image_to_string(Image.open('syslog.jpg'), lang="eng")
print(txt)
```

##4.3 実行結果
[JupyterLab](https://jupyter.org/)を使って、抽出結果を確認してみます。
詳細は確認していませんが、JPEGファイルからログを抽出できていることがわかります。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146813/846cb750-8d6b-60c3-a0db-53cc8dfaef03.png)


#5 スマフォのカメラで撮影したJPEGファイルから文字列の抽出

##5.1 JPEGファイルの作成
テスト用のJPEGファイルを作成します。
[WikipediaのTransportation](https://en.wikipedia.org/wiki/Japan)の部分をスマフォで撮影しました。
日本語がはいっていると変換できないので、英語だけの部分を撮影しました。
都合によりJPEGからPNGに変換したものを以下に示します。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146813/ad93c43f-8494-013a-7890-d774fd749c3f.png)


##5.2 ソースコード

```console:ソースコード
from PIL import Image
from PIL import ImageEnhance
import pyocr

engines = pyocr.get_available_tools()
if len(engines) == 0:
    print("OCR engine not found")
    sys.exit(1)
engine = engines[0]

# JPEGファイルをオープンする
im = Image.open('IMG_20211110_213000.jpg')

# 画像を明瞭にする
im_enhanced = ImageEnhance.Brightness(im).enhance(2.0)

# 文字をグレースケール化する
im_gray=im_enhanced.convert(mode='L')

# 画像を180度回転する。
im_rotate = im_gray.rotate(180)

# JPEG形式で保存する。
im_rotate.save('test.jpg','jpeg', quality=80, optimize=True)

# JPEGファイルから文字を抽出する。
txt = engine.image_to_string(Image.open('test.jpg'), lang="eng")
print(txt)
```

##5.3 実行結果
こちらも詳細は確認していませんが、JPEGファイルから文字列が抽出できていることがわかります。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146813/3cdcd9f7-9cdc-f268-ffe6-2cbee678bd9e.png)


#Z 参考情報
[いちばんやさしいPython機械学習の教本 人気講師が教える業務で役立つ実践ノウハウ](https://www.amazon.co.jp/%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84Python%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E6%95%99%E6%9C%AC-%E4%BA%BA%E6%B0%97%E8%AC%9B%E5%B8%AB%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B%E6%A5%AD%E5%8B%99%E3%81%A7%E5%BD%B9%E7%AB%8B%E3%81%A4%E5%AE%9F%E8%B7%B5%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6-%E9%88%B4%E6%9C%A8%E3%81%9F%E3%81%8B%E3%81%AE%E3%82%8A/dp/4295006416/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1636637258&sr=1-5)

[■新規にパッケージを入れたい、あるいは更新したい場合にエラーになる場合](https://hk29.hatenablog.jp/entry/2020/07/23/143342)
[Pythonで書くTesseract 4の基本的な使い方。APIとCLIからOCRを実行する方法](https://valmore.work/how-to-use-tesseract4-with-python/)