本節(jié)我們將介紹使用python識別一張圖片中的內(nèi)容茵乱,并試著得到一張表格,當然并不是類似于Excel的表格威根,而是該表格的markdown代碼。
注:原創(chuàng)內(nèi)容视乐,轉(zhuǎn)載請標明出處洛搀,首發(fā)于個人博客園賬號!
相關工具的安裝
本次實驗環(huán)境:win10,Pycharm2019.3佑淀。
安裝相關庫既可以使用命令行留美,也可以使用Pycharm自帶的工具。
打開cmd命令行或者powershell。
首先安裝PIL:
pip install Pillow
這是已經(jīng)安裝好PIL的示意圖谎砾。
之后逢倍,安裝pytesseract:
pip install pytesseract
這是已經(jīng)安裝好pytesseract的示意圖。
接下來景图,安裝Tesseract-OCR较雕,注意對應系統(tǒng)。
環(huán)境配置挚币,輸入
tesseract
tesseract -v
如果正常輸出亮蒋,表示配置成功了(我在實際操作時,安裝完成后自動配置了系統(tǒng)變量)忘晤,如果沒有宛蚓,找到之前安裝的路徑:
例如:
G:\Program Files (x86)\Tesseract-OCR
將該路徑添加到系統(tǒng)變量中
如果你想做英文之外的識別,Tesseract-OCR是沒有帶其他語言包的设塔,你可以去下載其他語言包。
這里我添加了簡體中文的語言包远舅,但是使用的是自帶的英文語言包闰蛔。
同時,我們還需要一項配置图柏,找到python安裝路徑下的pytesseract.py序六,我這里的路徑是
G:\Python37\Lib\site-packages\pytesseract
打開該路徑下的pytesseract.py文件。
將其中的
tesseract_cmd = tesseract.exe
替換為你之前安裝Tesseract-OCR的路徑蚤吹。
tesseract_cmd = 'G:/Program Files (x86)/Tesseract-OCR/tesseract.exe'
簡單測試
這是一張圖:
先簡單演示一下:
# -*- coding: utf-8 -*-
from PIL import Image
import pytesseract
# 注意圖片路徑和名稱
path = "3.jpg"
# lang參數(shù)指定了語言包,你可以下載相應的語言包,這里使用自帶的英文包
content = pytesseract.image_to_string(Image.open(path), lang="eng")
print(content)
由于數(shù)據(jù)有些多例诀,我只列出一部分。
90
70
50
40
130
70
90
20
120
110
100
30
...
70
60
80
60
80
60
50
50
60
60
60
60
這里呢裁着,我們的工作就完成了大部分了繁涂,接下來我們試著將它轉(zhuǎn)換一個對應表格的markdown代碼。
轉(zhuǎn)換
我們得到的結果是一個字符串二驰,離我們實際的表格內(nèi)容還有一段距離扔罪,也不難,做些數(shù)據(jù)處理就可以了桶雀。
markdown表格的語法:
| 左對齊 | 居中對齊 | 右對齊 |
| :-----| :----: | ----: |
| 內(nèi)容 | 內(nèi)容 | 內(nèi)容 |
| 內(nèi)容 | 內(nèi)容 | 內(nèi)容 |
這里直接上程序了:
# -*- coding: utf-8 -*-
from PIL import Image
import pytesseract
path = "3.jpg"
text = pytesseract.image_to_string(Image.open(path), lang="eng")
text_list = text.split()
rows = 12
lists = 6
md_text = []
list_name = ["語文", "數(shù)學", "英語", "物理", "化學", "生物"]
md_text.append(["|"])
for name in list_name:
md_text[0].append(str(name) + "|")
md_text[0] = "".join(md_text[0])
direction = ["中", "中", "中", "中", "中", "中"]
md_text.append(["|"])
for d in direction:
if str(d) == "左":
md_text[1].append(":----|")
if str(d) == "中":
md_text[1].append(":----:|")
if str(d) == "右":
md_text[1].append("----:|")
md_text[1] = "".join(md_text[1])
for r in range(rows):
res = "|"
for l in range(lists):
res += (text_list[r + l * rows] + "|")
md_text.append(res)
file = open("3.txt", "w")
for m in md_text:
file.write(m + "\n")
file.close()
print(md_text)
結果:
['|語文|數(shù)學|英語|物理|化學|生物|', '|:----:|:----:|:----:|:----:|:----:|:----:|', '|90|120|130|100|80|70|', '|70|110|110|60|60|60|', '|50|40|120|90|80|80|', '|40|60|100|70|60|60|', '|130|90|90|80|80|80|', '|70|50|90|60|60|60|', '|90|70|140|50|50|50|', '|20|140|100|90|70|50|', '|120|130|80|60|60|60|', '|110|90|60|50|70|60|', '|100|70|50|90|90|60|', '|30|100|50|80|80|60|']
看看文件內(nèi)容矿酵。
看看渲染結果:
結果還不錯,當然我們并沒有訓練樣本矗积,所以對于稍微復雜一點的圖片全肮,可能識別結果就不好了。
之后我將以這個為基礎棘捣,寫一個帶GUI的程序辜腺,界面如下:
完整帶GUI程序的github倉庫地址。