Summary
tesseractをPythonから呼び出してキャプチャ画像から文字認識する
今回はjupyter notebook版も作成しました
test_pytesseract.ipynb
詳細はTesseractとPyOCRで文字認識する(2021.7.3)を参照
brew install tesseract
brew install tesseract-lang
tessearact --list-langs
ls /usr/local/Cellar/tesseract/4.1.1/share/tessdata
実行はoutと指定するとout.txtというファイル名で出力される。
末尾に勝手に“.txt”が付与される。
tesseract input.png out -l jpn+eng
pytesseractをインストールしておく
pip install pytesseract
TesseractとPyOCRで文字認識する(2021.7.3)と同様に、 次のような書きかけのMarkdownファイルをキャプチャして認識してみた。
結果はこんな感じ(outX.txt)。どうかな?
-----------------------------------------
TESSERACT OUTPUT --> ORIGINAL IMAGE
-----------------------------------------
人@W $ TesseractとPyOCRで文字認識する(2021.7.3) .md
<写 = B 7 U H1 H2 H3 還員等 2 ぐッ S、 加 還: >>
ト ェ=デミ刃ミド
TesseractとPyOCRで文字認識する
に1「 (10に1 Akさりと2 (2021 ・7.3)
tesseractをPythonから呼び出してキャプチャ画像から文字認識する Summary
tesseractをPythonから呼び出してキャプチャ画像から文字認識する
MacへのTesseractのインストール
下記でインストールできるが、teseractそのものはすでにインストールされ _ 、
ていた (いつやったんだ?>俺) 下記でインストールできるが、teseractそのものはすでにインストールさ
1 れていた (いつやったんだ?>俺)
brew install tesseract CO 議にOOo
brew 1nsta11 tesseract-]ang
brew install tesseract-lang コマンドライン版の動作確認
もtessearao --1]1st-]angS
コマンドライン版の動作確認
実行
tessearact --list-langs tesSserao 1nput.png out.もxt -1 ]pn+eng
Ep
tesseract input.png out.txt -| jpn+eng
-----------------------------------------
TESSERACT OUTPUT --> THRESHOLDED IMAGE
-----------------------------------------
② 〇 = TesseractとPyOCRで文字認識する(2021.7.3).md
<三 且> B 『 U H1 H2 H3 計 乱 カ く> SQ、 愉 還: >>
# TesseractとPyOCRで文字認識する
マミ丸謀
(2021.7.3) TesseractとPyOCRで文字認識する
Surmrmary“<Dr> (2021 -7.3)
tesseractをPythonから呼び出してキャプチャ画像から文字認識する Summary
tesseractをPythonから呼び出してキャプチャ画像から文字認識する
電電 MacへのTesseractのインストール
MacへのTesseractのインストール
下記でインストールできるが、teseractそのものはすでにインストールされ ニー 、 _、 、 ーーし、
PT生Aekこらの) 下記でインストールでき るカ 、teseractそのものはすでにインストールさ
れていた (いつやったんだ?>俺)
brew install tesseract Drew +ngta11 tegseracoも
brew 1nsta]11 tesseraoモ-]angd
brew install tesseract-lang コマンドライン版の動作確認
teSBearaco七 --11sキ-]angs
コマンドライン版の動作確認
実行
tessearact --list-langs てesserao 1nput。png ou.もtx上 -] Jpn+eng
実行
tesseract input.png out.txt -| jpn+eng
-----------------------------------------
TESSERACT OUTPUT --> OPENED IMAGE
-----------------------------------------
@ @⑨ @ e| TeseeraotとPyOCRで文字手職する (2021.7.3) md
電 | 也 B 7 UM H H2 HS |画 | 1画 タッ く> に 四 軸] >
# TesseractとPyOCRて文字認識する
(2021.7.3) TesseractとPyOCRで文字認識する
還還 (2021.7.3)
い SummmmarY
jseserarをPythonから 呼び出してキャプチャ画像から文字硬職する
### MacへのTesseractのインストール MacへのTesseractのインストール
下記でインストールでききるが、teeeramgtそのものはすでにインストールさ
れていた (いつやったん民?>衛)
hreww 1ngta]] emmkerewo上
brewy 1nsmta]] teamerewot-]1ang
コマンドライン販の動作確認
七加g@-8TmO 一-] ]gヒ一] an
実行
七gg@TaO rp . pmxg Onロモ.モmE -] pnTeng
-----------------------------------------
TESSERACT OUTPUT --> CANNY EDGE IMAGE
-----------------------------------------
1のまゆまあ) |画 TessereetとPyOCRで文字認識する(2021.7.3).mg
が2IGYSIS(GIlelGttコ(の(RGXEE2GEt49記る)
Sp
(@0@1。7.$) TeSsereetとPOGN民で文字謀識する
SUUUIIIIGINYAMKのIP: (2021 。のる)
NSXSIIZIeICばYAtlllolePN 1のHPスウ2田()SPXeE ii SUUUidi/
esseract(をPythonから還び出してキャプチャ画像から文字認識する
VIlal人NOのIIISISGIgl(itの(ンク<ドだ2)
MMaeへのTessereetのイジスド王此
記でインストールできるが、teseractそのものはすでにインストールさき 間
IN Noe 由遇当 す 由 下記でインストールできるが、teseraetそのものはすでにインストールき
- れていた (いつやったんだ?>位)
SEP 和
prew insttall tesseract-lamg コマンドライン版の動作確認
| ease -etenae ーー 人 |
加にはンだ人ンの(5 因EIEEIEEE
実行
5
@sser'actt input.Q@ Gu -| om@m@
-----------------------------------------
TESSERACT OUTPUT --> ZOOMed IMAGE
-----------------------------------------
⑳ S TesseractとPyOCRで文字認識する(2021.7.3).md
<三 | 三> B JJ U H1 H2 H3 呈呈語計 ガ と SS 愉 k >>
ョーーニュニテ] 三立ド
TesseractとPyOCRで文字認識する
に0 1A Akの2 (2021 ・/.3)
tesseractをPythonから呼び出してキャプチャ画像から文字認識する Summary
tesseractをPythonから呼び出してキャプチャ画像から文字認識する
MacへのTesseractのインストール
下記でインストールできるが、teseractそのものはすでにインストールされ _ 、
4つとこも:本ことだ 下記でインストールできるが、teseractそのものはすでにインストールさ
れていた (いつやったんだ ?>俺)
brew install tesseract Dew ユnBta11 Cegeeエacし
brew 1nsta11] tesseracキ-1ang
brew install tesseract-lang コマンドライン版の動作確認
teSSGaエac上 --11sキ-]angSs
コマンドライン版の動作確認
実行
tessearaCt --list-langS tesserao nput .png Out.モxt -1] ]pn+engd
実行
tesseraCt inDput.Dng out.txt -| jpDn+eng
プログラムはこんな感じ
test_pytesseract.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# =======================================================
# tesseractとpytesseractを使って画像ファイルをOCRするスクリプト
#
# test_pytesseract.py
# coded by Noboru Harada (noboru@ieee.org)
#
# Changes:
# 2021/07/06: First version
# =======================================================
import re
import cv2
import numpy as np
import pytesseract
from pytesseract import Output
from matplotlib import pyplot as plt
from operator import itemgetter, attrgetter
# input file
= './'
IMG_DIR = 'infile.png'
filename_img
# text cleansing mode (0: None, 1: remove white space, 2: full cleansing)
= 1
mode
###################################
# define preprocessing functions
###################################
# get grayscale image
def get_grayscale(image):
return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# noise removal
def remove_noise(image):
return cv2.medianBlur(image,5)
#thresholding
def thresholding(image):
return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
#dilation
def dilate(image):
= np.ones((5,5),np.uint8)
kernel return cv2.dilate(image, kernel, iterations = 1)
#erosion
def erode(image):
= np.ones((5,5),np.uint8)
kernel return cv2.erode(image, kernel, iterations = 1)
#opening - erosion followed by dilation
def opening(image):
= np.ones((5,5),np.uint8)
kernel return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
#canny edge detection
def canny(image):
return cv2.Canny(image, 100, 200)
#skew correction
def deskew(image):
= np.column_stack(np.where(image > 0))
coords = cv2.minAreaRect(coords)[-1]
angle if angle < -45:
= -(90 + angle)
angle else:
= -angle
angle = image.shape[:2]
(h, w) = (w // 2, h // 2)
center = cv2.getRotationMatrix2D(center, angle, 1.0)
M = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
rotated return rotated
#template matching
def match_template(image, template):
return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
#zoom
def resize(image, gain):
= image.shape[:2]
h, w = cv2.INTER_LINEAR
inter #inter = cv2.INTER_NEAREST
return cv2.resize(image, (w * gain, h * gain), interpolation=inter)
#find squares
def find_squares(image):
return image
#clean up text
def clean_text(mode, intext):
= intext
text if mode == 1: # reduce multiple white spaces into one
= re.sub(r'[ \t]+', ' ', intext)
text elif mode == 2: # cleansing middle spaces in multi-byte characters and remove leading and trailing spaces
# format reguralization for Japanese char-set
= re.sub('([あ-んア-ン一-龥ー、。]) +((?=[あ-んア-ン一-龥ー、。]))', r'\1\2', intext)
text # remove multiple spaces
= re.sub(r'[ \t]+', ' ', text)
text # remove leading and trailing space, 2-byte space and tab space
= re.sub(r'^[ \t]+', '', text)
text = re.sub(r'(\| )|([\r\n|\n|\r]) +', r'\1\2', text)
text return text
###################################
# open input image
= cv2.imread(IMG_DIR + filename_img)
image
# plot original image
'''
b,g,r = cv2.split(image)
rgb_img = cv2.merge([r,g,b])
plt.figure(figsize=(16,12))
plt.imshow(rgb_img)
plt.title(filename_img)
plt.show()
'''
# Preprocess image
= resize(image, 2)
image2 = get_grayscale(image)
gray = thresholding(gray)
thresh = opening(gray)
opening = canny(gray)
canny = {'gray': gray,
images 'thresh': thresh,
'opening': opening,
'canny': canny}
# Plot images after preprocessing
= plt.figure(figsize=(20,12))
fig = []
ax = 2
rows = 2
columns = list(images.keys())
keys for i in range(rows*columns):
+1) )
ax.append( fig.add_subplot(rows, columns, i-1].set_title(filename_img + ' - ' + keys[i])
ax[='gray')
plt.imshow(images[keys[i]], cmap
# Get OCR output using Pytesseract
= r'-l jpn --oem 3 --psm 6'
custom_config print('-----------------------------------------')
print('TESSERACT OUTPUT --> ORIGINAL IMAGE')
print('-----------------------------------------')
print(clean_text(mode, pytesseract.image_to_string(image, config=custom_config)))
print('\n-----------------------------------------')
print('TESSERACT OUTPUT --> THRESHOLDED IMAGE')
print('-----------------------------------------')
print(clean_text(mode, pytesseract.image_to_string(thresh, config=custom_config)))
print('\n-----------------------------------------')
print('TESSERACT OUTPUT --> OPENED IMAGE')
print('-----------------------------------------')
print(clean_text(mode, pytesseract.image_to_string(opening, config=custom_config)))
print('\n-----------------------------------------')
print('TESSERACT OUTPUT --> CANNY EDGE IMAGE')
print('-----------------------------------------')
print(clean_text(mode, pytesseract.image_to_string(canny, config=custom_config)))
print('\n-----------------------------------------')
print('TESSERACT OUTPUT --> ZOOMed IMAGE')
print('-----------------------------------------')
print(clean_text(mode, pytesseract.image_to_string(image2, config=custom_config)))