利用python进行纸质文档识别(一)图像旋转矫正

前言

这学期我们上了一门软件工程课和数字图像处理课,软件工程课课设要求大家设计一款软件。作为一个学生助理,我早就对学校的问卷调查不满意了,填写完的纸质表格竟然还要输入成电子表格,人工手动输入,未免也太难受了。所以结合我所学的知识,我准备利用python+opencv做一款纸质文档识别软件,专门识别纸质表格转化成为电子表格。

原理

因为表格不仅仅有文字信息,同时还有位置信息,所以在识别表格时我们应该识别出文字和位置信息。文字信息一般是可以用OCR技术识别出来,这部分有很多相关的模块、库可以使用,但是位置信息的识别就有一定的困难。所以我们首先要解决这个位置信息。

当我们拿到一张纸质表格时,一般来说都会有框体,这个时候我们只要把最外围的框体识别出来,接着递归识别所有框体,然后再对所有小框体进行进行文字识别操作就会很简单。

实现方法

很明显,第一步是要解决最外头的这个框线识别问题。一般来说,不是每个人拍照都是横平竖直的,所以我们必须要对原始图像进行适当的倾斜矫正。在opencv里,我们有两个很好用的函数来进行这样的操作:
先用cv2.getPerspectiveTransform(target_points, four_points)得到旋转矩阵
然后再用cv2.warpPerspective(img, M, (weight, height))进行透视变换。
下面是该函数的一个演示

如果我们知道屏幕中间的四个角的位置,那么我们就能把它通过函数给校正

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# -*- coding: utf-8 -*-
"""
Created on Sun Jan 13 09:22:51 2019

@author: lei
"""

import cv2
import numpy as np
img= cv2.imread('rowRotate.jpg')#读取原始图片
target_points =[[278,189],[758,336],[570,1034],[65,900]]
#这里我们通过人工的方式读出四个角点A,B,C,D
height = img.shape[0]
weight = img.shape[1]
four_points= np.array(((0, 0),
(weight - 1, 0),
(weight - 1, height - 1),
(0, height - 1)),
np.float32)
target_points = np.array(target_points, np.float32)#统一格式
M = cv2.getPerspectiveTransform(target_points, four_points)
Rotated= cv2.warpPerspective(img, M, (weight, height))
cv2.imwrite("Rotated.jpg",Rotated)

程序运行效果图

旋转裁切的效果很棒,但这只是人工的方式寻找四个角点,可不可以想办法实现程序自动裁切呢?
对于这个问题,我经过大量地查阅资料和实验,终于发现了一个比较好的办法。那就是先把轮廓线找到,然后找轮廓线里面的角点。
由于篇幅关系,我将把这个留在后面讲解

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 前言
  2. 2. 原理
  3. 3. 实现方法
,