OCR文字识别技术有哪些应用?

  • 回答 (8)
  • 关注 (1)
  • 查看 (968)

OCR 是实时高效的定位与识别图片中的所有文字信息,返回文字框位置与文字内容。支持多场景、任意版面下整图文字的识别,以及中英文、字母、数字的识别。简单来说就是将图片上的文字内容,智能识别成为可编辑的文本,这么强大的功能在我们生活当中有哪些应用呢?

程序猿闯子程序猿闯子提问于
k的绝对值ひとーつ、ひいきは绝対せず! ふたーつ、不正は见逃さず! みっつ、见事にジャッジする! キャプテントンボーグ、ただいま参上!回答于
推荐

要提取文字的时候可以偷懒,不用再一个字一个字的敲了,效率杠杠的、

拿到这样一幅娱乐频道新闻中常见的图

图像降噪

首先,为了除去一些噪声数据的干扰,我们将图片灰度化处理,得到单通道图像,调用OpenCV的边缘检测方法

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)  

这里我们使用的是Sobel算子,用来计算图像灰度函数的近似梯度。此外还有Canny算子、Laplacian算子等,各自的特性可查阅相关资料

dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])  

其中,参数dx和dy分别表示x和y方向上的差分阶数,取1, 0表示只检测x方向上的边缘(因为我们要检测的文本大多是横向的)。检测完后的图像如下:

从图中可以看到,除了文字,还有一写其他的边缘包含在内(照片、景物等),接下来我们要做的就是去除这部分的干扰。这个时候,万能的OpenCV又站了出来,他表示:我认识一对好基友——膨胀和腐蚀,他们就是干这个的。

膨胀与腐蚀

膨胀(dilation)和腐蚀(erosion)是两种形态学运算方法,原理说来话长,简单表示他们的效果就是:膨胀会让图像的高亮区域变大,腐蚀会让图像的高亮区域变小,具体可阅读这篇博文:http://blog.csdn.net/xia316104/article/details/44748217,写得非常详细。通过膨胀与腐蚀,可以达到分割相连文字区域、去除噪声边缘的目的。

进行膨胀和腐蚀操作前,我们首先将图像二值化(即非黑:0即白:255的存储方式),进一步降噪,然后进行第一次膨胀。

c1 = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 8))  
c2 = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 6))

ret, bimg = cv2.threshold(sobel, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)  
dilation = cv2.dilate(bimg, c2, iterations=1)  

其中c1、c2中的参数20X8、20x6分别是腐蚀和膨胀的核,表示与图像区域做卷积的面积大小。效果如图:

可以看到经过膨胀后,文字区块已经被连成了一个矩形。但烦人的是,下部有一些竖直的边缘线也连到了一起。这时我们就要用到腐蚀了。

erosion = cv2.erode(dilation, c1, iterations=1)  
img_edge = cv2.dilate(erosion, c2, iterations=1)  

通过腐蚀,亮部的文字不会受到很大影响,而图像中参差不齐的边缘就遭了秧。此后我们再进行第二次膨胀,让文字边缘更加清晰整齐,这个过程有点类似PS抠图中调色阶的操作。最后,边缘结果如图所示:

筛选文字区域

完成上两步预处理后,我们现在可以正式开始着手筛选文字区域了。首先,我们根据边缘的连线得出所有的轮廓:

contours, hierarchy = cv2.findContours(img_edge, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  

好吧,还是有一些图片中的轮廓混进来了。通过观察,我们发现这些轮廓相比文字区块是很不规则的,有句话叫以己之长攻彼之弱,我们就用文字区块这个特点来排除掉不规则的轮廓。利用OpenCV的minAreaRect方法,我们可以得到一块区域的像素点集中包含的最小面积的矩形。其中文字区块包含的矩形通常连成一片,相较其他轮廓更细长。因此我们通过内含矩形的长宽比则可以筛选出文字区块:

# 记录文字区块数量
area_text_num = 0  
region = []

# 根据边缘连接得到所有轮廓
contours, hierarchy = cv2.findContours(img_edge, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for i in range(len(contours)):  
    cnt = contours[i]
    area = cv2.contourArea(cnt)

    # 筛掉面积过小的区块
    if area < 1000:
        continue

    # 得到最小矩形区域,转换为顶点坐标形式(矩形可能会有角度)
    rect = cv2.minAreaRect(cnt)
    box = cv2.cv.BoxPoints(rect)
    box = np.asarray(box)
    box = box.astype(int)

    x0 = box[0][0] if box[0][0] > 0 else 0
    x1 = box[2][0] if box[2][0] > 0 else 0
    y0 = box[0][1] if box[0][1] > 0 else 0
    y1 = box[2][1] if box[2][1] > 0 else 0
    height = abs(y0 - y1)
    width = abs(x0 - x1)

    # 筛掉不够“扁”的的区块,它们更有可能不是文字
    if height > width * 0.3:
        continue
    area_text_num += height * width
    region.append(box)

return region, area_text_num  

筛选之后结果如下:

有了结果之后,我们再根据业务的具体情况来设定“文字过多”的阈值,根据简单的统计后,目前界定的标准是文字区块面积占图片的10%,或者图片区块数量大于3。

特殊枪的潘鬼鬼前端开发回答于

识别快递运单啊,手写体OCR已运用到运单识别场景,解决了物流行业每日快递单人工输入工作量极大且极易出错,非常低效等问题,传统人工识别按照3min/单,1000单需要6.25个人/天,保证运单时效则需要耗费大量人力,考虑人力成本则影响运单及时性,成本和服务难两全。OCR运单识别速度可以达到毫秒级/单,并支持24小时识别服务 ,业务增长时只需要投入计算用服务器资源即可,弹性较大。传统识别相比,不仅成本可以降低,提高准确性,还可以保护用户的隐私泄露风险。

小川医学生回答于

手Q就有这个技术啊,在扫一扫、聊天窗口和空间图片大图预览共三个入口上支持了提取图片中文字的功能,可以方便的阅读、编辑、保存图片上的文字,从而可以对提取出的文字进行翻译、搜索。在多种场景下可以极大提升用户对图片上文字的阅读和记录效率

伤旧回答于

可以使用OCR识别票据

预处理

首先需要接收图像相关数据,使其水平竖直方向垂直,接下来使用算法进行检测是否为票据,最终二值化方便识别。

旋转图像识别收据

我们有三种方案来识别票据,下文对这三种方案做了测试。

1. 高阈值的自适应二值化技术。 2. 卷积神经网络(CNN)。 3. Haar特征分类器。

自适应二值化技术

图中图像上包含了完整的数据,同时票据又与背景有些差距。为了能更好识别相关数据,我们需要将图片进行旋转。使其水平沿竖直方向对齐。

使用Opencv中的自适应阈值化函数adaptive_threshold和scikit-image框架来调整收据数据。利用这两项函数,可以在高梯度区域保留白色像素,低梯度区域保留黑色像素。这使得我们获得了一个高反差的样本图片,通过裁剪,就能得到票据的相关信息了

使用卷积神经网络(CNN)

起初我们决定使用CNN来做相关位置检测的接收点,就像我们之前做对象检测项目一样。我们使用判断角度来拾取相关关键点。这种方案虽然好用,但是和高阈值对比检测裁剪更差。

因为CNN只能找到文本的角度坐标,而文字的角度变化很大,这就意味着CNN模型不是很精准。详情请参考下面CNN测试的结果。

使用Haar特征分类器来识别收据

作为第三种选择,我们尝试使用Haar特征分类器来做分类筛选。然而经过一周的分类训练和改变相关参数,我们并没有得到什么比较积极的结果,甚至发现CNN都比Haar表现好得多。

二值化

最终我们使用opencv中的adaptive_threshold方法进行二值化,经过二值化处理,我们得到了一个不错的图片。

文本检测

接下来我们来介绍几个不同的文本检测组件

通过链接组件检测文本

首先,我们使用Opencv中的find Contours函数找到链接的文本组。大多数链接的组件是字符,但是也有二值化留下来嘈杂的文本,这里我们通过设置阈值的大小来过滤相关文本。

然后,我们执行合成算法来合成字符,如: Й和=。通过搜索最临近的字符组合合成单词。这种算法需要你找到每个相关字字母最临近的字符,然后从若干字母中找到最佳选择展示。

接下来文字形成文字行,通过判断文字是否高度一致来判断文本是否属于同一行。

当然,这个方案的缺点是不能识别有噪声的文本。

使用网格对文本进行检测

我们发现几乎所有票据都是相同宽度的文本,所以我们设法在收据上画出一个网格,并利用网格分割每个字符:

网格一下子精简了票据识别的难度。神经网络可以精准识别每个网格内的字符。这样就解决了文本嘈杂的情况。最终可以精确统计文本数量。

我们使用了以下算法来识别网格。

首先,我在二值化镜像中使用这个连接组件算法。

然后我们发现图中左下角有些是真,所哟我们通过二维周期函数来调整网格识别。

修正网格失真背后主要的思想是利用图形峰值点找到非线性几何失真,换句话说,我们必须找到这个函数的最大值的和。另外,我们还需要一个最佳失真值才行。

我们使用ScipyPython模块中的RectBivariateSpline函数来参数化几何失真。并用Scipy函数进行优化。得到如下结果:

总而言之,这个方法缓慢且不稳定,所以坚决不打算使用这个方案。

光学字符识别

我们通过组连接识别发现文本,并识别完整的单词。

识别通过连接组发现的文本

对于文本识别,我们使用卷积神经网络(CNN)接收相关字体进行培训。输出部分,我们通过对比来提升概率。我们那个几个最初的几个选项多对比,发现有99%的准确识别率后。又通过对比字典来提高准确度,并消除相关类似的字符,如"З" 和 "Э"造成的错误。

然而,当涉及嘈杂的文本时,该方法性能却十分低下。

识别完整的单词

当文本太嘈杂的时候,需要找到完整的单词才能进行单个字母的识别。我们使用下面两个方法来解决这个问题:

  • LSTM网络
  • 图像非均匀分割技术

LSTM网络

您可以阅读这些文章,以更加深入了解使用卷积神经网络识别序列中的文本 ,或我们可以使用神经网络建立与语言无关的OCR吗? 为此,我们使用了OCRopus库来进行识别。

我们使用了等宽的字体来作为人工识别样本进行训练。

训练结束后,我们由利用其他数据来测试我们的神经网络,当然,测试结果非常积极。这是我们得到的数据:

训练好的神经网络在简单的例子上表现十分优秀。同样,我们也识别到了网格不适合的复杂情况。

我们抽取的相关的训练样本,并让他通过神经网络进行训练。

为了避免神经网络过度拟合,我们多次停止并修正训练结果,并不断加入新数据作为训练样本。最后我们得到以下结果:

新的网络擅长识别复杂的词汇,但是简单的文字识别却并不好。

我们觉得这个卷积神经网络可以细化识别单个字符来使文本识别更加优秀。

图像非均匀分割技术

因为收据字体是等宽的字体,所以我们决定按照字符分割字体。首先,我们需要知道每个字母的宽度。因此,字符的宽度尤为重要,我们需要估计每个字母的长度,利用函数,我们得到下图。选择多种模式来选取特定的字母宽度。

我们得到一个单词的近似宽度,通过除以字符中的字母数,给出一个近似分类:

区分最佳的是:

这种分割方案的准确度是非常高的:

当然,也有识别不太好的情况:

分割后我们在使用CNN做识别处理。

从收据中提取含义

我们使用正则表达式来查找收据中购买情况。所有收据都有一个共通点:购买价格以XX.XX格式来撰写。因此,可以通过提取购买的行来提取相关信息。个人纳税号码是十位数,也可以通过正则表达式轻松获取。同样,也可以通过正则表达式找到NAME / SURNAME等信息。

过河不认人前端工程师回答于

车牌识别,道路上的摄像头抓取违章拍照,系统能够快速的识别出车牌号码,然后就会通知你去扣分缴费,哈哈哈

Rom_z全职程序员,喜欢围棋回答于

OCR本质是图像识别,原理也和其他的图像识别问题基本一样。包含两大关键技术:文本检测和文字识别。先将图像中的特征进行提取并检测目标区域,之后对目标区域的字符进行分割和分类。以深度学习兴起的时间为分割点,直至近五年之前,业界最为广泛使用的仍然是传统的OCR识别技术框架,而随着深度学习的崛起,基于这一技术的OCR识别框架以另外一种新的思路迅速突破了原有的技术瓶颈(如文字定位、二值化和文字分割等),并已在工业界得到广泛应用。

成品冻K感情是人一辈子也捉摸不透的东西回答于

现在不是有很多种传图识字的小程序嘛,用的就是这个技术

营销通外推软件快速排名营销通外推软件快速排名tonesoft出品99224848排名软件回答于

所属标签

可能回答问题的人

  • Y. Ji

    6 粉丝0 提问1 回答
  • Superbeet

    4 粉丝0 提问0 回答
  • 腾讯云AI中心

    腾讯云 · 产品经理 (已认证)

    63 粉丝0 提问19 回答
  • 莫烦

    3 粉丝0 提问0 回答
  • 罗罗可爱多

    腾讯 · 高级研究员 (已认证)

    9 粉丝0 提问4 回答
  • 晏栋栋栋

    2 粉丝0 提问1 回答

扫码关注云+社区

领取腾讯云代金券