摘要
本文将介绍如何使用Python进行超长图片中的表格和文字的提取。我们将探讨不同的库和方法,以及表格分割,以实现高效且准确的文字识别。
引言
在数字化时代,我们经常需要从图片中提取信息,尤其是表格数据。Python提供了多种工具和库来帮助我们完成这项任务,例如Pytesseract、CnOcr、OpenCV等。本文将指导你如何使用这些工具来实现超长图片中的文字和表格提取。
正文
一、环境准备
- Python 3.x
- Pytesseract 库
- CnOcr 库
- OpenCV 库
- Numpy 库
二、使用步骤
1.安装库
- 安装库cv2:pip install opencv-python
- 安装库CnOcr:
pip install CnOcr
pip install onnxruntime
如果安装cnocr库报错需要下载工具VisualCppBuildTools_Full.exe,选择文件mu_visual_cpp_build_tools_2015_update_3_x64_dvd_dfd9a39c.iso,解压后,双击VisualCppBuildTools_Full.exe即可自动进行安装,安装完成后再安装cnocr库和onnxruntime库。
参考相关文章:https://blog.csdn.net/m0_66954933/article/details/132208740
2.引入库
import cv2
import pytesseract
import numpy as np
from cnocr import CnOcr
ocr = CnOcr()
3.OCR文字识别
- cnocr 识别图片的中文
from cnocr import CnOcr
ocr = CnOcr()
text= ocr.ocr('test.png')
print('识别图片信息为:' + text)
- pytesseract 识别图片的英文
import pytesseract
from PIL import Image
pytesseract.pytesseract.tesseract_cmd = 'E:/Tesseract-OCR/tesseract.exe'
image = Image.open('test.png')
text= pytesseract.image_to_string(image, lang='eng')#读取文字,此为默认英文
print('识别图片信息为:' + text)
参考相关文章:
https://zhuanlan.zhihu.com/p/384620684
https://zhuanlan.zhihu.com/p/448253254
https://blog.csdn.net/zengbowengood/article/details/104901596
4.完整代码
import cv2
# import pytesseract
import numpy as np
from cnocr import CnOcr
ocr = CnOcr()
# 使用python+opencv处理表格图片,按照表格进行分割,并识别分割后的子图片中的文字
def pic_2_cnocr(path_location = 'C:/Users/Administrator/Desktop/7.jpg'):
image = cv2.imread(path_location, 1)
# 灰度图片
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化
binary = cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)
# 识别横线
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (binary.shape[1] // 40, 1))
dilatedcol = cv2.dilate(cv2.erode(binary, kernel, iterations=1), kernel, iterations=1)
# 识别竖线
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, binary.shape[0] // 20))
dilatedrow = cv2.dilate(cv2.erode(binary, kernel, iterations=1), kernel, iterations=1)
# 识别黑白图中的白色交叉点,将横纵坐标取出
ys, xs = np.where(cv2.bitwise_and(dilatedcol, dilatedrow) > 0)
mylisty = [] # 纵坐标
mylistx = [] # 横坐标
# 通过排序,获取跳变的x和y的值,说明是交点,否则交点会有好多像素值值相近,我只取相近值的最后一点
# 这个10的跳变不是固定的,根据不同的图片会有微调,基本上为单元格表格的高度(y坐标跳变)和长度(x坐标跳变)
myxs = np.sort(xs)
for i in range(len(myxs) - 1):
if (myxs[i + 1] - myxs[i] > 10):
mylistx.append(myxs[i])
mylistx.append(myxs[-1]) # 要将最后一个点加入
myys = np.sort(ys)
for i in range(len(myys) - 1):
if (myys[i + 1] - myys[i] > 10):
mylisty.append(myys[i])
mylisty.append(myys[-1]) # 要将最后一个点加入
ocr_form = list()
ocr_forms = list()
# 循环y坐标,x坐标分割表格
for i in range(len(mylisty) - 1):
for j in range(len(mylistx) - 1):
# 在分割时,第一个参数为y坐标,第二个参数为x坐标
ROI = image[mylisty[i]:mylisty[i + 1], mylistx[j]:mylistx[j + 1]]
# 调用cnocr文字识别工具
res = ocr.ocr(ROI)
text = "".join([re['text'].replace("\n", "") for re in res])
ocr_form.append(text)
ocr_forms.append(ocr_form)
ocr_form = []
return ocr_forms
参考相关文章:https://blog.csdn.net/HXiao0805/article/details/90729541
总结
本文介绍了如何使用Python进行超长图片中的文字和表格提取。通过结合Pytesseract、CnOcr和OpenCV等库,我们可以有效地处理和分析图像数据。