python提取圖片內容並轉換成對應表格的markdown代碼


本節我們將介紹使用python識別一張圖片中的內容,並試着得到一張表格,當然並不是類似於Excel的表格,而是該表格的markdown代碼。

注:原創內容,轉載請標明出處!



相關工具的安裝

本次實驗環境:win10,Pycharm2019.3。
安裝相關庫既可以使用命令行,也可以使用Pycharm自帶的工具。

打開cmd命令行或者powershell。
首先安裝PIL:

pip install Pillow


這是已經安裝好PIL的示意圖。

之后,安裝pytesseract:

pip install pytesseract

這是已經安裝好pytesseract的示意圖。

接下來,安裝Tesseract-OCR,注意對應系統。
環境配置,輸入

tesseract
tesseract -v

如果正常輸出,表示配置成功了(我在實際操作時,安裝完成后自動配置了系統變量),如果沒有,找到之前安裝的路徑:
例如:

G:\Program Files (x86)\Tesseract-OCR

將該路徑添加到系統變量中

如果你想做英文之外的識別,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'

簡單測試

這是一張圖:

3.jpg

先簡單演示一下:

# -*- coding: utf-8 -*-
from PIL import Image
import pytesseract

# 注意圖片路徑和名稱
path = "3.jpg"
# lang參數指定了語言包,你可以下載相應的語言包,這里使用自帶的英文包
content = pytesseract.image_to_string(Image.open(path), lang="eng")
print(content)

由於數據有些多,我只列出一部分。

90
70
50
40
130
70
90
20
120
110
100
30
...
70
60
80
60
80
60
50
50
60
60
60
60

這里呢,我們的工作就完成了大部分了,接下來我們試着將它轉換一個對應表格的markdown代碼。


轉換

我們得到的結果是一個字符串,離我們實際的表格內容還有一段距離,也不難,做些數據處理就可以了。
markdown表格的語法:

| 左對齊 |  居中對齊 | 右對齊 |
| :-----| :----: | ----: |
| 內容 | 內容 | 內容 |
| 內容 | 內容 | 內容 |

這里直接上程序了:

# -*- 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 = ["語文", "數學", "英語", "物理", "化學", "生物"]
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)

結果:

['|語文|數學|英語|物理|化學|生物|', '|:----:|:----:|:----:|:----:|:----:|:----:|', '|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|']

看看文件內容。


看看渲染結果: ![](https://img2018.cnblogs.com/blog/1950846/202002/1950846-20200226165418182-1409409454.png)

結果還不錯,當然我們並沒有訓練樣本,所以對於稍微復雜一點的圖片,可能識別結果就不好了。

之后我以這個為基礎,寫一個帶GUI的程序,界面如下:


完整帶GUI程序的github倉庫地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM