python-opencv表格识别
最近学习了⼀下opencv,做了个简单的⼩东西,就是识别图⽚中的表格,识别完成后再把数据写⼊到csv中保存起来。
环境准备:
下⾯先说下我们应该要准备下啥环境:
1.python安装完成(笔者python3.7)
3.pytesseract(python对tesseract的封装,调⽤时是通过pytesseract去调⽤tesseract)
gets函数怎么写>excel入门教程免费下载4.python的⼀些类库,numpy,matplotlib
5.特别提⼀下要导⼊opencv的包,安装的时候名称是opencv-python,使⽤的时候名称是cv2,
cv2不是说是opencv的版本⼆哦,意思是在cv的基础上做了提升和优化的意思,跟版本没关系。
这⾥还有⼀点要注意的,使⽤cv2报错的话,可能还要安装⼀下opencv-python-headless。
识别步骤:
我们先来简单说⼀下原理,是怎么识别表格的呢?是这样的,如果直接咱们把⼀张图⽚⽤tesseract去识别成中⽂,它会把表格的横竖线都算进去,
很多汉字都识别不出来,效果也很难看。所以我们要做的前置步骤就是识别出excel图⽚的⼀个个单元格,把每个单元格中的信息给识别出来,然后拼接
成⼀个csv,在最后转为excel只需要通过excel导⼊csv的数据就可以了。
注意事项:本⼈⽔平有限,⽬前还只能处理⽐较简单的⽅⽅正正的表格,下⾯的程序是可直接跑的。但是如果有⼀些图⽚的表格是拍出来斜着的,或有⼲扰物
⽐如有⽀笔在图⽚中,或有很复杂的⽔印,这种⽬前还处理不了,还在继续研究当中。有兴趣的⼩伙伴可以⼀起玩啊,加个⼀起讨论交流。
不过咱们也对这些情况有⼀些⽅案,还在处理当中:
自学编程后如何挣钱1.如果表格是倾斜的咱们可以使⽤透射变换先将表格处理成正常的矩形;
2.简单的⽔印,可以通过灰度之后,选个合理的阈值,将图⽚⼆值化后,⽩⿊图可以去掉⽔印。
这⾥咱们安利⼀个很好的python-opencv的⼊门教程:
好了废话说完了,开始教程:
原图:
1.读⼊图⽚灰度化:
可以理解为把彩⾊图⽚变为灰⾊图⽚
raw = cv2.imread(src,1)
# 灰度图⽚
gray = cv2.cvtColor(raw, cv2.COLOR_BGR2GRAY)
2.图⽚⼆值化:
可以理解为把图⽚变成只有⿊⽩两种颜⾊,这样更⽅便处理,再说咱们处理表格也不需要颜⾊
binary = cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5) # 展⽰图⽚
cv2.imshow("binary_picture", binary)
⼆值化的图⽚:
3.识别出横线,竖线:
在此之后,如果图像不够清晰或者有⼩像素点,可以使⽤腐蚀,膨胀等操作让图⽚更清晰⼀点
rows, cols = binary.shapehtml符号代码对照表
scale = 40
# ⾃适应获取核值
# 识别横线:
kernel = StructuringElement(cv2.MORPH_RECT, (cols // scale, 1))
java技术面试常见问题eroded = de(binary, kernel, iterations=1)
dilated_col = cv2.dilate(eroded, kernel, iterations=1)
cv2.imshow("excel_horizontal_line", dilated_col)
# 识别竖线:
scale = 20
kernel = StructuringElement(cv2.MORPH_RECT, (1, rows // scale))
eroded = de(binary, kernel, iterations=1)
dilated_row = cv2.dilate(eroded, kernel, iterations=1)
cv2.imshow("excel_vertical_line:", dilated_row)
横线竖线的图:
4.计算出横竖线的焦点,就得到了每个单元格的坐标
# 将识别出来的横竖线合起来
bitwise_and = cv2.bitwise_and(dilated_col, dilated_row)
cv2.imshow("excel_bitwise_and", bitwise_and)
# 标识表格轮廓
merge = cv2.add(dilated_col, dilated_row)
cv2.imshow("entire_excel_contour:", merge)
# 两张图⽚进⾏减法运算,去掉表格框线
merge2 = cv2.subtract(binary, merge)python入门教程资料
cv2.imshow("binary_sub_excel_rect", merge2)
new_kernel = StructuringElement(cv2.MORPH_RECT, (2, 2))
erode_image = phologyEx(merge2, cv2.MORPH_OPEN, new_kernel) cv2.imshow('erode_image2', erode_image)
merge3 = cv2.add(erode_image, bitwise_and)
cv2.imshow('merge3', merge3)
# 将焦点标识取出来
ys, xs = np.where(bitwise_and > 0)
焦点图:
5.将坐标筛选下,临近的⼏个算⼀个:
这⾥说⼀下图⽚的数组中是(y,x)这样的,y在前⾯
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论