范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

实战使用OpenCV和PyTesseract对文档进行OCR

  随着世界各地的组织都希望将其运营数字化,将物理文档转换为数字格式是非常常见的。这通常通过光学字符识别 (OCR) 完成,其中文本图像(扫描的物理文档)通过几种成熟的文本识别算法之一转换为机器文本。当在干净的背景下处理打印文本时,文档 OCR 的性能最佳,具有一致的段落和字体大小。
  在实践中,这种情况远非常态。发票、表格甚至身份证明文件的信息分散在整个文件空间中,这使得以数字方式提取相关数据的任务变得更加复杂。
  在本文中,我们将探索一种使用 Python 为 OCR 定义文档图像区域的简单方法。我们将使用信息分散在整个文档空间的文档示例——护照。以下样本护照放置在白色背景中,模拟复印的护照副本。
  从此护照图像中,我们希望获得以下字段:  名字/名字 姓氏 中文名 汉字的姓氏 护照号码
  首先,我们将导入所有必需的包。最重要的包是用于计算机视觉操作的OpenCV和PyTesseract,它是强大的 Tesseract OCR 引擎的 Python 包装器。  from cv2 import cv2 import pytesseract import pandas as pd import numpy as np import math from matplotlib import pyplot as plt
  接下来,我们将使用 cv2.imread 读取我们的护照图像。我们的第一个任务是从这个伪扫描页面中提取实际的护照文件区域。我们将通过检测护照的边缘并将其从图像中裁剪出来来实现这一点。  img = cv2.imread("imagesPassport.png",0) img_copy = img.copy() img_canny = cv2.Canny(img_copy, 50, 100, apertureSize = 3)
  OpenCV 库中包含的Canny 算法使用多阶段过程来检测图像中的边缘。使用的最后三个参数是较低阈值和较高阈值(分别为 minVal 和 maxVal),以及内核大小。
  运行 Canny 算法会产生以下输出。请注意,由于选择了低阈值,因此保留了最少的边缘。
  img_hough = cv2.HoughLinesP(img_canny, 1, math.pi / 180, 100, minLineLength = 100, maxLineGap = 10)
  接下来,我们在边缘检测图像上使用另一种称为霍夫变换的算法,通过检测线绘制出护照区域的形状。minLineLength 参数定义了一个形状必须包含多少像素才能被视为"线",而 maxLineGap 参数表示像素序列中被视为相同形状的最大允许间隙。  (x, y, w, h) = (np.amin(img_hough, axis = 0)[0,0], np.amin(img_hough, axis = 0)[0,1], np.amax(img_hough, axis = 0)[0,0] - np.amin(img_hough, axis = 0)[0,0], np.amax(img_hough, axis = 0)[0,1] - np.amin(img_hough, axis = 0)[0,1]) img_roi = img_copy[y:y+h,x:x+w]
  我们的护照四面都是直线——文件的边缘。因此,有了我们的线条信息,我们可以选择通过检测到的线条的外边缘来裁剪我们的护照区域:
  将护照竖直旋转后,我们开始在图像中选择要捕获数据的区域。几乎所有国际护照都符合ICAO 标准,该标准概述了护照页的设计和布局规范。这些规范之一是机读区 (MRZ),即护照文件底部有趣的两行。你们的文件的视觉检查区 (VIZ) 中的大部分关键信息也包含在机读区中,机器可以读取这些信息。在我们的练习中,那台机器是我们值得信赖的 Tesseract 引擎。  img_roi = cv2.rotate(img_roi, cv2.ROTATE_90_COUNTERCLOCKWISE) (height, width) = img_roi.shape img_roi_copy = img_roi.copy() dim_mrz = (x, y, w, h) = (1, round(height*0.9), width-3, round(height-(height*0.9))-2) img_roi_copy = cv2.rectangle(img_roi_copy, (x, y), (x + w ,y + h),(0,0,0),2)
  让我们使用四个维度定义护照图像中的 MRZ 区域:水平偏移(从左侧)、垂直偏移(从顶部)、宽度和高度。对于 MRZ,我们将假设它包含在我们护照的底部 10% 内。因此,使用 OpenCV 的矩形函数,我们可以在区域周围绘制一个框来验证我们的尺寸选择。
  img_mrz = img_roi[y:y+h, x:x+w] img_mrz =cv2.GaussianBlur(img_mrz, (3,3), 0) ret, img_mrz = cv2.threshold(img_mrz,127,255,cv2.THRESH_TOZERO)
  在新图像中裁剪所选区域。我们将对裁剪后的图像进行一些基本的图像预处理,以促进更好的读出——高斯模糊和简单阈值。
  mrz = pytesseract.image_to_string(img_mrz, config = "--psm 12")
  我们现在准备应用 OCR 处理。在我们的 image_to_string 属性中,我们配置了"带有方向和脚本检测(OSD)的稀疏文本"的页面分割方法。这旨在捕获我们图像中的所有可用文本。
  将 Pytesseract 输出与我们的原始护照图像进行比较,我们可以观察到读取特殊字符时的一些错误。为了获得更准确的读数,可以使用 Pytesseract 的白名单配置进行优化;然而就我们的目的而言,电流读数的准确性就足够了。  mrz = [line for line in mrz.split(" ") if len(line)>10] if mrz[0][0:2] == "P<":   lastname = mrz[0].split("<")[1][3:] else:   lastname = mrz[0].split("<")[0][5:] firstname = [i for i in mrz[0].split("<") if (i).isspace() == 0 and len(i) > 0][1] pp_no = mrz[1][:9]
  根据 ICAO 关于 MRZ 代码结构的指导原则应用一些字符串操作,我们可以提取护照持有人的姓氏、名字和护照号码:
  不是英文的文本怎么办?没问题——Tesseract 引擎已经为100 多种语言训练了模型(尽管每种支持的语言的 OCR 性能的稳健性不同)。  img_roi_copy = img_roi.copy() dim_lastname_chi = (x, y, w, h) = (455, 1210, 120, 70) img_lastname_chi = img_roi[y:y+h, x:x+w] img_lastname_chi = cv2.GaussianBlur(img_lastname_chi, (3,3), 0) ret, img_lastname_chi = cv2.threshold(img_lastname_chi,127,255,cv2.THRESH_TOZERO) dim_firstname_chi = (x, y, w, h) = (455, 1300, 120, 70) img_firstname_chi = img_roi[y:y+h, x:x+w] img_firstname_chi = cv2.GaussianBlur(img_firstname_chi, (3,3), 0) ret, img_firstname_chi = cv2.threshold(img_firstname_chi,127,255,cv2.THRESH_TOZERO)
  使用相同的区域选择方法,我们再次为目标数据字段定义维度(x、y、w、h),并对裁剪后的图像提取应用模糊和阈值处理。
  lastname_chi = pytesseract.image_to_string(img_lastname_chi, lang = "chi_sim", config = "--psm 7") firstname_chi = pytesseract.image_to_string(img_firstname_chi, lang = "chi_sim", config = "--psm 7")
  现在,在我们的 image_to_string 参数中,我们将添加输入文本的语言脚本,简体中文。
  要完成练习,请将所有收集的字段传递给字典并输出到表格以供实际使用。
  OCR 感兴趣区域的显式定义只是在OCR 中获取所需数据的众多方法之一。根据你们的用例,使用其他方法(例如轮廓分析或对象检测)可能最有效,正如我们的护照练习所示,在应用 OCR 之前对图像进行适当的预处理是关键。在处理具有不同图像质量的真实文档时,尝试不同的预处理技术以找到最适合你们的文档类型的方法非常重要。

荣耀平板V7Pro正式发布首发迅鲲1300T,自由创造力在Magic3系列之后,赵明还在今晚发布了打造自由创造力的荣耀平板V7Pro。该系列提供了晨辉金曙光蓝以及钛空银三种配色。其中晨辉金曙光蓝采用了小牛皮质感背壳,在质感与触感等方面更币圈曝惊天大窃案6亿美元加密货币被盗据西班牙经济学家报网站8月11日报道,价值6亿美元的加密货币被盗,这可能是史上最大规模的加密货币盗窃案。黑客利用了PolyNetwork中的一个漏洞,该平台旨在连接不同的区块链,以联想第二代电竞手机来了!LenovoPhoneDuel2月底开卖联想今日在台湾推出第二代电竞手机LenovoPhoneDuel2,预计8月25日在各大通讯卖场开卖。LegionPhoneDuel2推出两种规格,16GB256GB版本,售价279预算2000元,该买个什么手机?今天给大家列出来几款2000元左右的机器,对比一下性能,看看哪个手机性价比最高?型号价格配置VIVOIqooNeo32200hrRAM12ROM128VIVOIqooNEO3198去线下买荣耀手机,店员会怎么介绍呢?去线下买荣耀手机,店员会怎么介绍呢?你们觉得会怎么介绍,有些店铺会直接说这是华为荣耀plat5t。估计这些店铺应该不是官方店,是第三方合作店吧,只为好卖吧。反正很多线下渠道,会一个音质可以媲美录音棚?麦拉达T8电子管电容式麦克风体验从2020年开始,由于众所周知的特殊原因导致,大家宅家的时间变得越来越多,于是家庭娱乐也就成了众多网友关注的焦点。对于爱玩游戏的人来说,宅家期间畅玩各类游戏大作无疑非常的嗨皮。对于风靡全球的4款手机,明白人都推荐,看看你懂不懂手机?明白人告诉你,这四款手机最值得买,一款比一款猛!1。一加9R这款手机是一加旗下的首款中端机,秉承着给消费者更多选择的权利,一加9R的性价比也是很高的,一经发布也收获了比较多的好评。高价位的手机应该怎么选?选这几款准没错一,小米11这款手机搭配骁龙888处理器,屏幕方面更采用AMOLED四曲面柔性屏。并且有120Hz的刷新率。摄像方面有前置2000万超清相机和后置一亿像素电影相机。电池方面有460你用的NFC防伪技术并不靠谱!普通NFC并不能真正防伪来探秘NFC的深层防伪本质吧NFC,即近场通信(NearFieldCommunication,NFC),是一种由非接触式射频识别(RFID)演变而来的非触控式的互联技术,是一种短距开启笔电新赛道realmeBook将于8月18正式发布今天,realme官方正式宣布,将于8月18日举行828全球真粉节暨realmeBook新品发布会。发布会上,备受期待的realme首款笔电产品realmeBook将正式亮相,拉开诸葛亮曾造过机器人?机器人发展史大揭秘人们对机器人的幻想已持续了2000多年。早在1000多年前,诸葛亮曾造过木牛流马,用来运输粮食,以解决运力不足的困难,这可以说是人造机器牛马的先例。13世纪,德国科学家曾试制过能替
体现法系车的独特,雪铁龙C3L的那些反人类设计前段时间,东风雪铁龙正式与东风标致合拼销售渠道,两家本事同根的品牌联手,应该会有新的作为。当雪铁龙日前发布了全新车型C3L后,觉得真是开拓了眼界,同时也很想问问雪铁龙的产品开发负责抽油烟机工作原理及常见故障摘要抽油烟机的基本结构主要由箱体电机风轮排烟管蜗壳止回阀导风板面板集排油装置照明装置电源开关和电源线等这些部分构成。油烟机的基本构成部件箱体支撑整个吸油烟机的结构,导风板及面抽油烟电磁炉需要掌握哪几个重要的电压参考值?(原创)维修电磁炉时除了掌握望闻问切和跑线跳线代换等基本手段外,测量重要的几个电压参考点也非常必要,因为相关点位的测量信息直接反应了电器的工作状态。电磁炉的电源分为主副电源,主供电源由交流洗衣机故障代码海尔全自动洗衣机故障代码F1海尔洗衣机水位传感器接触不良E1海尔洗衣机排水超时,检查排水管是否被堵E2海尔洗衣机上盖没有盖好E3海尔洗衣机脱水不平衡,把衣服重新抖散开来再脱水E4海波轮洗衣机常见故障一,进水不止a一般情况为进水阀阀芯卡住,通电打开后无法复位,导致一直进水,此情况先更换进水阀b如果故障未解决,问题出在水位开关,使用时间一长,水位开关可停止进水,引起进水不止,此时这款宝马旗舰SUV真够奢!X7行政型M运动套装宝马旗舰型SUV当属X7,不仅车身尺寸大,提供67座,新车基于CLAR模块化平台打造,外观采用最新的家族式设计语言,整体外观霸气豪华。动力方面国内在售的X7搭载3。0T发动机,以及奥迪A4l对比宝马3系,怎么选看你要舒适还是运动如果你最近手握30万的预算,想买一台豪华品牌中级车,好开拉风而且满足家用,那你一定绕不开这两台车,奥迪A4L和宝马3系!今天我们拿这两台车,从驾控乘坐性价比等方面对比,看哪台最合适奔驰G350售142万多,才2。0T,网友称幸亏三把锁还在近日,奔驰G350在国内上市,官方指导价为142。98万元,搭载了2。0T发动机,配9速手自一体变速箱,车辆最大功率258马力,峰值扭矩为370牛米,官方公布的0100kmh加速时空调故障代码前言无论是什么品牌的空调,在使用的时候出现故障是在所难免的,而在空调出现故障的时候,一般都会显示相对应的一些故障代码,来告诉我们故障的具体原因,帮助我们可以更好的辨别故障,方便更快丰田新款普拉多发布,搭载2。8T柴油引擎在硬派越野车中,无论地位还是知名度,丰田的普拉多(霸道)是大批越野爱好者的首选。在国内有着不错的销量和口碑,只可惜一汽丰田国产的车型已经停产,想买这款车的要通过进口渠道。近日,官方日系性能控的菜,大排量后驱手动,性能不输丰田Supra对于不少玩车的朋友,这台车的发布,让大家重新燃起了激情,日系玩味回来了!日产近日发布了全新ZProto跑车,这就是大家熟悉的370Z换代车型。相对于370350Z已经有11年了,这