使用Python從圖像中提取表格
大約一年前,我被分配任務(wù)從文件中提取和結(jié)構(gòu)化數(shù)據(jù),主要是包含在表格中的數(shù)據(jù)。我之前對計算機視覺沒有了解,并且很難找到一個合適的“即插即用”的解決方案。當(dāng)時可選的方案要么是基于最新神經(jīng)網(wǎng)絡(luò)(NN)的解決方案,這些解決方案龐大而繁瑣,要么是基于OpenCV的較簡單的解決方案,但不夠一致。
受現(xiàn)有OpenCV腳本的啟發(fā),我開發(fā)了一種簡單而一致的方法來提取表格,并將其制作成一個開源的Python庫:img2table。
鏈接:https://github.com/xavctn/img2table
我的庫有什么作用?
與深度學(xué)習(xí)解決方案相比,這個輕量級的包不需要訓(xùn)練和最小化參數(shù)化。它提供了以下功能:
- 識別圖像和PDF文件中的表格,包括在表格單元級別的邊界框。
- 通過支持OCR服務(wù)/工具(Tesseract、PaddleOCR、AWS Textract、Google Vision和Azure OCR目前支持)來提取表格內(nèi)容。
- 處理復(fù)雜的表格結(jié)構(gòu),如合并單元格。
- 實現(xiàn)糾正圖像的傾斜和旋轉(zhuǎn)的方法。
- 提取的表格以一個簡單的對象形式返回,包括一個Pandas DataFrame表示。
- 將提取的表格導(dǎo)出為Excel文件的選項,保留其原始結(jié)構(gòu)。
如何使用它?
您可以通過pip安裝該庫,然后就可以使用了:
pip install img2table
在文檔中識別表格只需調(diào)用一個函數(shù):
from img2table.document import Image
# Instantiation of the image
img = Image(src="myimage.jpg")
# Table identification
img_tables = img.extract_tables()
# Result of table identification
img_tables
[ExtractedTable(title=None, bbox=(10, 8, 745, 314),shape=(6, 3)),
ExtractedTable(title=None, bbox=(936, 9, 1129, 111),shape=(2, 2))]
上述示例中使用的圖像
如果我們想提取表格的內(nèi)容,則需要使用OCR工具,可以按如下方式實現(xiàn):
from img2table.document import PDF
from img2table.ocr import TesseractOCR
# Instantiation of the pdf
pdf = PDF(src="mypdf.pdf")
# Instantiation of the OCR, Tesseract, which requires prior installation
ocr = TesseractOCR(lang="eng")
# Table identification and extraction
pdf_tables = pdf.extract_tables(ocr=ocr)
# We can also create an excel file with the tables
pdf.to_xlsx('tables.xlsx',
ocr=ocr)
從PDF中提取的表格示例
最后,在簡單的情況下,可以通過設(shè)置`borderless_tables`參數(shù)來執(zhí)行“無邊框”表格的提取。這允許檢測那些單元格不需要完全被邊框包圍的表格。
“無邊框”表格提取示例
這就是全部!實際上,庫并沒有太多復(fù)雜的東西,因為目標(biāo)是盡可能簡化,以避免其他可用解決方案可能帶來的復(fù)雜性。
有關(guān)更詳細的文檔和示例,請查看項目的GitHub頁面:https://github.com/xavctn/img2table
底層實現(xiàn)
所有圖像處理都使用OpenCV和opencv-python庫完成。然而,這仍然相當(dāng)基礎(chǔ)。
算法的骨架是Hough變換,它能夠識別圖像中的線條,使我們能夠檢測圖像的水平和垂直線條。
cv2.HoughLinesP(img, rho, theta, threshold, None, minLinLength, maxLineGap)
之后,對線條進行一些處理以從線條中識別單元格,然后從單元格中識別表格。
實現(xiàn)算法的簡化表示
大多數(shù)計算使用Polars進行,以實現(xiàn)良好的性能和速度。