环境搭建
安装依赖-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
目录里面。- 语言包地址:https://github.com/tesseract-ocr/tessdata_best。里面有各种语言包,都是训练好的语言包。
- 简体中文下载:chi_sim.traineddata , chi_sim_vert.traineddata
- 英文包:eng.traineddata。
- 设置环境变量
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)