【Opencv图像处理之文档扫描OCR识别】

写在前面

文档扫描OCR识别所要做的工作为将将印刷或手写文档(如下图)转换为可编辑、可搜索的文本,从而方便用户对文本的编辑、存储和共享。

本文识别案例图片如下图。这个过程中涉及图像预处理、边缘检测、透视变换等,后续章节中将对OCR的整个过程进行概述。
在这里插入图片描述
编辑环境:Python 3.6.3 + Opencv 3.4.1.15 + Pycharm
ps:转载请标明原文出处!

1 图像的读入与预处理

1.1 参数的定义

所用ID为pycharm,为方便对不同图片进行OCR识别,引入argparse模块来定义参数,代码如下。其中,add_argument中required需定义为True值方可在Edit Configuration Settings 界面进行修改,代码下方即为定义方法(将红色划线部分修改为OCR识别对象图像即可)。

ag = argparse.ArgumentParser()
ag.add_argument('-i', '--image', required=True, help='Path to the image to be scanned')
args = vars(ag.parse_args())

在这里插入图片描述

1.2 图像获取

定义完参数后,需从args中获取图像,代码如下。

img = cv2.imread(args['image'])
img_resized = resize(img, height=500)
cv_show(img_resized)

resize封装函数如下,进行resize操作仅仅因为原图较大,笔记本显示不全,将其转换一下后能看到所有图像。

def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    dim = None
    (h, w) = image.shape[:2]
    if width is None and height is None:
        return image
    elif width is None and height is not None:
        r = height/float(h)
        dim = (int(r*w), height)
    else:
        r = width/float(w)
        dim = (int(r*h), width)
    # interpolation表示插值方法
    resized = cv2.resize(image, dim, interpolation=inter)
    return resized

在这里插入图片描述

1.3 图像预处理

为提高轮廓检测的精确度,需对图像进行预处理,预处理步骤不固定,以最后结果最佳为准。本文依次采用灰度化处理、高斯滤波、边缘检测,得到下图。

img_resized_gray = cv2.cvtColor(img_resized, cv2.COLOR_BGR2GRAY) # 转为灰度图
img_resized_gray = cv2.GaussianBlur(img_resized_gray, (5, 5), 0) # 高斯滤波
edged = cv2.Canny(img_resized_gray, 75, 200)
cv_show(edged)

在这里插入图片描述

2 轮廓检测

为得到透视变换的处理范围,需得到图像中纸张的轮廓,此时用到轮廓检测技术。

cnt = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]

代码较简单,列在上面了。需注意的是,cnt是一个包含多个轮廓的列表,要得到最外面的轮廓,还需进一步操作。操作方法也较简单,先通过cv2.contourArea函数对轮廓进行面积排序,从大到小排列,取前五个(面积最大的五个)轮廓。再对每个轮廓进行多边形逼近,以得到一个边数较少的近似多边形approx。最后只保留边数为4的多边形即为我们所需要的轮廓。

cnt = sorted(cnt, key=cv2.contourArea, reverse=True)[:5] # 5也不是固定的,万一有干扰项
for c in cnt:
    epsilon = 0.02*cv2.arcLength(c, closed=True)
    approx = cv2.approxPolyDP(c, epsilon, closed=True)
    if len(approx)== 4:
        scanCnt = approx
        break

效果如下
在这里插入图片描述

3 透视变换

透视变换采用4点变换技术,首先得到矩形外轮廓4角点的坐标,再计算出矩形的两条宽和两条长的相对长度,将较长的长和宽的数值赋予转换后的矩形边框。最后用cv2.warpPerspective函数完成转换。

为方便代码书写,采用封装函数形式完成透视变换。

ratio = img.shape[0] / 500.0
warped = fout_point_transform(originate, scanCnt.reshape(4, 2)*ratio)

相关封装函数定义如下。

def orderpoint(pst):
    # 计算四个角的坐标
    res = np.zeros((4, 2), dtype='float32')
    sum_1 = np.sum(pst, axis=1)
    res[0] = pst[np.argmin(sum_1)]
    res[2] = pst[np.argmax(sum_1)]
    diff_1 = np.diff(pst, axis=1)
    res[1] = pst[np.argmin(diff_1)]
    res[3] = pst[np.argmax(diff_1)]
    return res

def fout_point_transform(image,pst):
    # 获得4个角的坐标
    edge_point = orderpoint(pst)
    (tl, tr, br, bl) = edge_point
    width1 = np.sqrt((tl[0] - tr[0])**2 + (tl[1] - tr[1])**2)
    width2 = np.sqrt((bl[0] - br[0])**2 + (bl[1] - br[1])**2)
    max_width = max(int(width1), int(width2))
    length1 = np.sqrt((tl[0] - bl[0])**2 + (tl[1] - bl[1])**2)
    length2 = np.sqrt((tr[0] - br[0])**2 + (tr[1] - br[1])**2)
    max_length = max(int(length1), int(length2))
    distance = np.array([
        [0, 0],
        [max_width-1, 0],
        [max_width-1, max_length-1],
        [0, max_length-1]], dtype='float32')
    m = cv2.getPerspectiveTransform(edge_point, distance)
    warped = cv2.warpPerspective(image, m, (max_width, max_length))
    return warped

转换效果如下,将不同角度的图像转换为正视图。
在这里插入图片描述

4 保存图像

透视变换后,对图像进行保存操作以便进行文本识别任务。保存前,为提高精确度,对图像进行二值化处理,再用imwrite函数进行保存操作。

warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
ref = cv2.threshold(warped, 100, 255, cv2.THRESH_BINARY)[1]
cv_show(warped)
cv2.imwrite('scan.jpg', ref)

5 文本识别

文本识别前,需要安装一下pytesseract工具包,具体安装方法总结如下:

  1. 打开网址https://digi.bib.uni-mannheim.de/tesseract/进行下载(打不开就科学上网)。
  2. 配置环境变量如E:\Program Files (x86)\Tesseract-OCR(此为安装目录)。
  3. tesseract -v进行测试,tesseract XXX.png 得到结果 。
  4. 打开prompt进入相应环境中输入pip install pytesseract
  5. tesseract_cmd 修改为绝对路径即可

安装完成后,即可进行文本识别工作,剩下的就比较简单了,直接上代码。

from PIL import Image
import pytesseract
import cv2
import os
image = cv2.imread('scan.jpg')
# 预处理操作与之前一样
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 3)
text = pytesseract.image_to_string(Image.open(filename))
print(text)

最终结果如下:
在这里插入图片描述
效果还是不错的!

6 结语

该任务为学习时练手任务,适合小白上手,欢迎各位大佬交流!!关注博主私聊即可获得全套源码!

ps:转载请标明原文出处!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: QT是一种跨平台的开发框架,可以用来开发各种应用程序。OpenCV是一个开源的计算机视觉库,可以用来处理图像和视频等图像处理任务。OCR(Optical Character Recognition)库是一种能够读取图像中文字并将其转换为可编辑文本的技术。 在使用QT和OpenCV来开发一个汉字识别的图像演示程序时,我们可以按照以下步骤进行: 1. 首先,需要创建一个QT项目,并添加OpenCV的库文件和头文件,以便在项目中使用OpenCV功能。 2. 然后,需要加载待识别的图像文件。可以使用QT的图像处理功能加载图像文件,并在QT的图形界面中显示出来。 3. 接下来,我们可以使用OpenCV图像处理功能对加载的图像进行预处理,以提高识别准确度。例如,可以使用图像平滑、二值化等技术来消除噪声和增强图像的对比度。 4. 然后,我们可以使用OCR库来识别图像中的汉字。OCR库可以通过训练和学习,识别不同的汉字字符。可以使用OCR库提供的API来调用该功能,并将识别结果返回给应用程序。 5. 最后,我们可以将识别的汉字结果显示在QT的图形界面中,以便用户查看和编辑。可以使用QT的文本框组件来显示识别出的文字,并提供其他相关的编辑功能。 通过以上步骤,我们可以完成一个简单的QT和OpenCV结合的汉字识别图像演示程序。用户可以通过该程序加载图像文件,并对图像中的汉字进行识别和编辑。这个演示程序可以为用户展示汉字识别的基本原理和功能,并为用户提供一个直观的界面来操作和体验。 ### 回答2: Qt是一种跨平台的C++应用程序开发框架,OpenCV是一个用于图像处理和计算机视觉的开源库,OCR(Optical Character Recognition)是光学字符识别的缩写,用于将印刷体文字转化为可编辑的电子文字。 要实现在Qt中使用OpenCV进行OCR汉字识别,可以按照以下步骤进行: 1. 准备样本数据集:收集一些包含汉字的图像样本,包括不同字体、大小和倾斜度的样本,用于训练和测试OCR模型。 2. 安装OpenCV和Qt:下载并安装OpenCV和Qt开发环境,确保能够在Qt中调用OpenCV库。 3. 加载样本数据集:使用OpenCV读取样本数据集中的图像文件,并将其转换为适合进行OCR处理的数据格式。 4. 预处理图像:对加载的图像进行预处理,例如灰度化、二值化、降噪等操作,以提高OCR识别准确性。 5. 训练OCR模型:使用OpenCV的机器学习算法,如支持向量机(SVM)或卷积神经网络(CNN),对预处理后的图像进行训练,以建立用于识别汉字的模型。 6. 图像识别:使用训练好的OCR模型对待识别的图像进行处理,提取其中的汉字信息,并将其转化为可编辑的电子文字。 7. 在Qt界面中展示结果:将识别到的汉字结果显示在Qt的界面中,以供用户查看和编辑。 通过以上步骤,我们可以在Qt中使用OpenCV库进行OCR汉字识别的演示。用户可以加载图像,点击识别按钮后,程序将自动进行图像处理和汉字识别,并将结果显示在界面上。这样,用户可以方便地通过这个演示程序了解OCR汉字识别的基本原理和实现方式。 ### 回答3: QT是一种流行的跨平台应用程序开发框架,而OpenCV是一个广泛使用的计算机视觉库。OCR(Optical Character Recognition)库可以用于识别图像中的文字。下面是一个300字的中文回答,旨在介绍如何在QT中使用OpenCVOCR库来实现汉字识别的演示程序。 首先,我们需要在QT项目中集成OpenCV库。可以通过在项目文件中添加OpenCV相关的库路径和头文件路径来实现。然后,在QT项目中创建一个窗口,将图像显示在窗口上。 接下来,我们需要加载要识别的图像。使用OpenCV的函数,我们可以读取图像文件,并将其转换为OpenCV的Mat对象。然后,我们可以将Mat对象转换为QT图像对象,以便在QT窗口中显示。 在加载图像后,我们可以使用OCR库来识别其中的汉字。OCR库可以读取OpenCV的Mat对象,然后将其转换为文本。 为了在QT中使用OCR库,可能需要对其进行一些设置和配置。这包括选择合适的OCR引擎,以及设置字库和语言。这些设置可能因库的不同而有所不同,可参考OCR库的文档以获取详细的配置信息。 一旦配置完毕,我们可以调用OCR库的识别函数,将图像传递给它。OCR库将扫描图像,并将识别结果返回为文本。我们可以在QT窗口中显示这些识别结果。 最后,我们可以通过增加一些用户交互功能来改进演示程序。例如,我们可以添加一个按钮,使用户能够选择不同的图像进行识别。我们还可以让用户可以调整OCR库的一些参数,以改进识别的准确性。 总之,通过集成OpenCVOCR库,我们可以在QT中开发一个简单的汉字识别演示程序。这个演示程序可以加载图像,调用OCR库来识别汉字,并在QT窗口中显示识别结果。同时,我们可以通过增加一些用户交互功能来提高演示程序的实用性和可定制性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星未漾~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值