python结合opencv调用谷歌tesseract-ocr实现印刷体的表格识别识别

jupiter
2021-11-19 / 0 评论 / 1,060 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年12月07日,已超过1080天没有更新,若内容或图片失效,请留言反馈。

环境搭建

安装依赖-leptonica库

  • 下载源码
git clone https://github.com/DanBloomberg/leptonica.git
  • configure
sudo apt install automake
bash autogen.sh
./configure
  • 编译安装
make
sudo make install
  • 这样就安装好了leptonica库

谷歌tesseract-ocr编译安装

  • 下载源码
git clone https://github.com/tesseract-ocr/tesseract.git  tesseract-ocr
  • 安装依赖

    sudo apt-get install g++ autoconf automake libtool autoconf-archive pkg-config libpng12-dev libjpeg8-dev libtiff5-dev zlib1g-dev  libleptonica-dev -y
  • 安装训练所需要的库(只是调用可以不用安装)
sudo apt-get install libicu-dev libpango1.0-dev  libcairo2-dev
  • configure
bash autogen.sh
./configure
  • 编译安装
make
sudo make install

# 可选项,不训练可以选择不执行下面两条
make training
sudo make training-install


sudo ldconfig
  • 安装对应的字体库并添加对应的环境变量

    • 下载好的语言包 放在/usr/local/share/tessdata目录里面。

    • 设置环境变量
vim ~/.bashrc

# 在.bashrc的文件末尾加入以下内容
export TESSDATA_PREFIX=/usr/local/share/tessdata

source ~/.bashrc
  • 查看字体库
tesseract --list-langs
  • 使用tesseract-ocr测试
# 识别/home/app/1.png这张图片,内容输出到output.txt 里面,用chi_sim 中文来识别(不用加.traineddata,会默认加)
tesseract /home/app/1.png output -l chi_sim

# 查看识别结果
cat output.txt

安装python调用依赖包

pip install pytesseract

配合opencv调用进行印刷体表格识别

代码

import cv2
import numpy as np
import pytesseract
import matplotlib.pyplot as plt
import re

#原图
raw = cv2.imread("table3.2.PNG")
# 灰度图片
gray = cv2.cvtColor(raw, cv2.COLOR_BGR2GRAY)
# 二值化
binary = cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)

rows, cols = binary.shape

# 识别横线
scale = 50
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (cols // scale, 1))
eroded = cv2.erode(binary, kernel, iterations=1)
dilated_col = cv2.dilate(eroded, kernel, iterations=1)


# 识别竖线
scale = 10
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, rows // scale))
eroded = cv2.erode(binary, kernel, iterations=1)
dilated_row = cv2.dilate(eroded, kernel, iterations=1)

# 标识交点
bitwise_and = cv2.bitwise_and(dilated_col, dilated_row)
plt.figure(dpi=300)
# plt.imshow(bitwise_and,cmap="gray")

# 标识表格
merge = cv2.add(dilated_col, dilated_row)
plt.figure(dpi=300)
# plt.imshow(merge,cmap="gray")


# 两张图片进行减法运算,去掉表格框线
merge2 = cv2.subtract(binary, merge)
plt.figure(dpi=300)
# plt.imshow(merge2,cmap="gray")


# 识别黑白图中的白色交叉点,将横纵坐标取出
ys, xs = np.where(bitwise_and > 0)


# 提取单元格切分点

# 横坐标
x_point_arr = []
# 通过排序,获取跳变的x和y的值,说明是交点,否则交点会有好多像素值值相近,我只取相近值的最后一点
# 这个10的跳变不是固定的,根据不同的图片会有微调,基本上为单元格表格的高度(y坐标跳变)和长度(x坐标跳变)
sort_x_point = np.sort(xs)
for i in range(len(sort_x_point) - 1):
    if sort_x_point[i + 1] - sort_x_point[i] > 10:
        x_point_arr.append(sort_x_point[i])
    i = i + 1
x_point_arr.append(sort_x_point[i])  # 要将最后一个点加入

# 纵坐标
y_point_arr = []
sort_y_point = np.sort(ys)
for i in range(len(sort_y_point) - 1):
    if (sort_y_point[i + 1] - sort_y_point[i] > 10):
        y_point_arr.append(sort_y_point[i])
    i = i + 1
# 要将最后一个点加入
y_point_arr.append(sort_y_point[i])

# 循环y坐标,x坐标分割表格
plt.figure(dpi=300)
data = [[] for i in range(len(y_point_arr))]
for i in range(len(y_point_arr) - 1):
    for j in range(len(x_point_arr) - 1):
        # 在分割时,第一个参数为y坐标,第二个参数为x坐标
        cell = raw[y_point_arr[i]:y_point_arr[i + 1], x_point_arr[j]:x_point_arr[j + 1]]

        #读取文字,此为默认英文
        text1 = pytesseract.image_to_string(cell, lang="chi_sim+eng")

        #去除特殊字符
        text1 = re.findall(r'[^\*"/:?\\|<>″′‖ 〈\n]', text1, re.S)
        text1 = "".join(text1)
        print('单元格图片信息:' + text1)
        data[i].append(text1)
        
        plt.subplot(len(y_point_arr),len(x_point_arr),len(x_point_arr)*i+j+1)
        plt.imshow(cell)
        plt.axis('off')

plt.tight_layout() 
plt.show()

实现效果

  • 表格图片
  • 识别结果
单元格图片信息:停机位Stands
单元格图片信息:空器避展限制Wingspanlimitsforaircraft(m)
单元格图片信息:Nr61.62.414-416.886.887.898,899.ZZ14
单元格图片信息:80
单元格图片信息:Nr101,102.105,212.219-222,228.417-419,874-876.895-897.910-912
单元格图片信息:65
单元格图片信息:NrZZ11
单元格图片信息:61
单元格图片信息:Nr103,104.106.107.109,117,890-894.ZL1,ZL2(deicingstands)
单元格图片信息:52
单元格图片信息:Nr878.879
单元格图片信息:51
单元格图片信息:Nr229.230
单元格图片信息:48
单元格图片信息:Nr877
单元格图片信息:42
单元格图片信息:Nr61R.62L
单元格图片信息:38.1
单元格图片信息:Nr61L.62R.108.110-116,118.201-211.213-218,223-227.409-413,414L.414R.415L.415R.416L,416R.417R.418R.419R.501-504.601-610,886L,886R.887L.887R.888.889.898L.898R.8991L.899R_901-909,910R.911R.912R.913-916.921-925.ZZ1IL.ZZ12.ZZ13
单元格图片信息:36
单元格图片信息:NrZZ11IR
单元格图片信息:32
单元格图片信息:Nr884.885
单元格图片信息:29(fuselagelength32.8)
单元格图片信息:Nr417L.418L.419L
单元格图片信息:24.9
单元格图片信息:Nr910L.911L.912L.931-946
单元格图片信息:24
0

评论 (0)

打卡
取消