Python 识别图片中表格

python 进行图片识别,首先需要安装相应的Python库文件和识别引擎tesseract-ocr。
库文件:
1、pytesseract 图片识别库
2、numpy 矩阵库
3、PIL 图像处理库(仅支持到Python2.7)
4、Pillow 图像处理库(支持Python3.0以上)
一、Python 库文件安装方法:
1、命令行安装
pip install pytesseract
   pip install Pillow
2、使用pycharm编辑器安装,具体步骤省略,大家可以百度一下。
二、图片识别引擎tesseract-ocr安装
软件名称:tesseract-ocr-setup-4.00.00dev.exe
下载地址:https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-4.00.00dev.exe
1、Tesseract是开源的OCR引擎。Tesseract最初设计用于英文识别,经过改进引擎和训练系统,它能够处理其它语言和UTF-8字符。Tesseract 3.0能够处理任何Unicode字符,但并非在所有语言上都工作得很好。Tesseract在庞大字符集语言(比如中文)上较慢,但是工作良好。
2、默认不支持中文,在软件安装时一定要选择chi_sim(简体中文),安装成后,可以在

定义字符集,引入相应的类库
# — coding:UTF-8 —
from skimage import io, data, morphology, segmentation
import numpy as np
from PIL import Image
import pytesseract
import os

# pytesser3.tesseract_exe_name="C:/Program Files (x86)/Tesseract-OCR/tesseract.exe"
#识别图片中的文字
def img_to_txt(file):
    if os.path.exists(file):
        image = Image.open(file)
        # 英文
        # vcode = pytesseract.image_to_string(image,"eng")
        # txt = pytesser3.image_to_string(image, "chi_sim")
        txt = pytesseract.image_to_string(image, "chi_sim")
        print("{}识别内容:{}".format(file,txt))

for i in range(16):
img_file = r"img/pic_{}.jpg".format(i)
img_to_txt(img_file)
img_to_txt(r"img/abc.png")

img = io.imread("test.jpg",True) # as_grey=true 灰度图片

#二值化
bi_th=0.81
img[img<=bi_th]=0
img[img>bi_th]=1

io.imsave(“gray.jpg”,img)

膨胀腐蚀操作

def dil2ero(img,selem):
img=morphology.dilation(img,selem) # 膨胀
imgres=morphology.erosion(img,selem) # 腐蚀
return imgres

求图像中的横线和竖线

rows,cols=img.shape
scale=10 #这个值越大,检测到的直线越多,图片中字体越大,值应设置越小。需要灵活调整该参数。

col_selem=morphology.rectangle(cols//scale,1)
img_cols=dil2ero(img,col_selem)

row_selem=morphology.rectangle(1,rows//scale)
img_rows=dil2ero(img,row_selem)

线图

img_line=img_cols*img_rows
io.imsave(“table.jpg”,img_line)

点图

img_dot=img_cols+img_rows
img_dot[img_dot>0]=1

io.imsave(“table_dot.jpg”,img_dot)

收缩点团为单像素点(3×3)

def isolate(imgdot):
idx=np.argwhere(imgdot<1) # img值小于1的索引数组
rows,cols=imgdot.shape

for i in range(idx.shape[0]):
    c_row=idx[i,0]
    c_col=idx[i,1]
    if c_col+1<cols and c_row+1<rows:
        imgdot[c_row,c_col+1]=1
        imgdot[c_row+1,c_col]=1
        imgdot[c_row+1,c_col+1]=1
    if c_col+2<cols and c_row+2<rows:
        imgdot[c_row+1,c_col+2]=1
        imgdot[c_row+2,c_col]=1
        imgdot[c_row,c_col+2]=1
        imgdot[c_row+2,c_col+1]=1
        imgdot[c_row+2,c_col+2]=1
return imgdot

img_dot=isolate(img_dot)

io.imsave(“table_dot_del.jpg”,img_dot)

io.imshow(img)

io.imsave(“1234.jpg”,img)

print(type(img)) #显示类型

print(img_dot.shape) #显示尺寸
print(img_dot.shape[0]) #图片高度
print(img_dot.shape[1]) #图片宽度

# print(dot_idxs.size)

for m in range(img_dot.shape[0]):

if m > 100: break

print(“col{}”.format(m),end=" ")

for n in range(img_dot.shape[1]):

if img_dot[m][n]==0 :

print(img_dot[m][n], end= " ")

print("",end="\n")

dot_idxs=np.argwhere(img_dot<1) # img_dot值等于0的索引数组
table_cols = [] #记录每行有几个单元格
table_rows = 1
table_row_index = dot_idxs[0][0] #第一行点图y值坐标
colu_dot = 0 # 单元格数量

for n,indx in enumerate(dot_idxs):
if indx[0] == table_row_index : # 如果点图y值坐标相同则为同一行
colu_dot = colu_dot + 1
print(indx,end=" “)
else :
table_cols.append(colu_dot-1) # 将行单元格数量加入table_cols列表
table_row_index = dot_idxs[n+1][0] #记录下一行位置索引
colu_dot = 1 # 清0后,换行记录单元格数量
print(”",end="\n")
print(indx, end=" ")

print("")
for n,v in enumerate(table_cols):
print(“row{}:{}”.format(n,v))
row_num = len(table_cols)
max_row = max(table_cols)
min_row = min(table_cols)
cell_nums = sum(table_cols)
print(“这个表格一共{}行”.format(row_num))
print(“这个表格最多行单元格数:{}”.format(max_row))
print(“这个表格最少行单元格数:{}”.format(min_row))
print(“这个表格一共{}个单元格”.format(cell_nums))

go = input(“表格分析是否正确?”)

if go == “no” :
exit(0)

开始识别单元格

a_dots =[] #记录已经处理过的A点坐标

cells = [] # 记录单元格的A点和D点坐标 [[a11,a12,d11,d12][a21,a22,d21,d22]]]

cell_num = 0

cell_a = []

cell_b = []

cell_c = []

cell_d = []

if min_row == min_row : # 标准表格 n*n
for n,v in enumerate(table_cols):
print(“row{}:”.format(n),end= " “)
for i in range(v):
row_dot_num = v + 1
cell_num = n * row_dot_num
cell_a_index = cell_num + i
cell_b_index = cell_a_index + 1
cell_c_index = cell_a_index + row_dot_num
cell_d_index = cell_c_index +1
print(“cell[{}]:a{} b{} c{} d{}”.format(cell_num+i,dot_idxs[cell_a_index],
dot_idxs[cell_b_index],dot_idxs[cell_c_index],dot_idxs[cell_d_index]),end= " “)
x1=dot_idxs[cell_a_index][1]+1 # 加1去除列边框线
x2=dot_idxs[cell_b_index][1]
y1=dot_idxs[cell_a_index][0]+1 # 加1去除行边框线
y2=dot_idxs[cell_c_index][0]
#print(x1,x2,y1,y2)
roi=img[y1:y2,x1:x2] # 50~100 行,50~100 列(不包括第 100 行和第 100 列)
io.imsave(“img/pic_{}.jpg”.format(cell_num+i),roi)
print(””, end="\n")

猜你喜欢

转载自blog.csdn.net/weixin_44499757/article/details/86354033