快捷搜索:  汽车  科技

ocr文字识别算法(基于Python实现在线OCR文字识别系统)

ocr文字识别算法(基于Python实现在线OCR文字识别系统)pip install easyocr pip install twisted pip install logging pip install djangoeasyocr图像处理的库以及文字处理的库;twisted支持TCP Server的库;logging支持日志输出的库;django支持web的库;OCR engine核心代码:python.exe --version Python 3.8.6安装系统所依赖的python库:下面我们通过python开发一个OCR在线识别系统,该系统提供一个简单的web界面,支持上传一张包含中文字符的图片,经过系统的识别后,可以提取出图片中包含的文字,并将文字输出到web界面。OCR在线识别系统特性:python版本信息如下:

ocr文字识别算法(基于Python实现在线OCR文字识别系统)(1)

ocr简介

OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。

随着云计算,大数据和AI技术的快速发展,OCR技术也相对比较成熟。在网络中也可以很方便地找到OCR识别软件,不管是离线工具还是在线识别,OCR识别率还是蛮高的。

一个普通的OCR识别软件大致的工作流程如下:

  1. 影像输入;
  2. 影像前处理;
  3. 文字特征抽取;
  4. 比对识别;
  5. 人工校正;
  6. 结果输出;

对待识别图像进行如下预处理,可以降低特征提取算法的难度,并能提高识别的精度:

  • 二值化:由于彩色图像所含信息量过于巨大,在对图像中印刷体字符进行识别处理前,需要对图像进行二值化处理,使图像只包含黑色的前景信息和白色的背景信息,提升识别处理的效率和精确度。
  • 图像降噪:由于待识别图像的品质受限于输入设备、环境、以及文档的印刷质量,在对图像中印刷体字符进行识别处理前,需要根据噪声的特征对待识别图像进行去噪处理,提升识别处理的精确度。

ocr文字识别算法(基于Python实现在线OCR文字识别系统)(2)

开发OCR在线识别系统

下面我们通过python开发一个OCR在线识别系统,该系统提供一个简单的web界面,支持上传一张包含中文字符的图片,经过系统的识别后,可以提取出图片中包含的文字,并将文字输出到web界面。

OCR在线识别系统特性:

  • 在线识别功能;
  • OCR engine提供socket服务;
  • 可以支持TCP Server模式;
  • 也可以支持命令行模式;
下面我们简单介绍下OCR在线识别系统的核心代码

python版本信息如下:

python.exe --version Python 3.8.6

安装系统所依赖的python库:

pip install easyocr pip install twisted pip install logging pip install django

  • easyocr图像处理的库以及文字处理的库;
  • twisted支持TCP Server的库;
  • logging支持日志输出的库;
  • django支持web的库;

OCR engine核心代码:

#!/usr/bin/python # -*- coding: UTF-8 -*- import sys getopt import logging from abc import ABC import easyocr from twisted.internet import reactor from twisted.internet.protocol import Serverfactory from twisted.protocols.basic import LineReceiver logging.basicConfig(level=logging.INFO format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) def server(port): class SimpleServerFactory(ServerFactory): reader = None def __init__(self reader): self.reader = reader class SimpleReceiver(LineReceiver ABC): def connectionMade(self): logger.info('Got connection from %s' self.transport.client) def connectionLost(self reason): logger.info('%s disconnected' self.transport.client) def dataReceived(self data): if type(data) == bytes: logger.info("Received data ...") else: logger.info("Received data:%s" data) result = reader.readtext(data detail=0) str = ''; for item in result: str = str item self.sendLine(str.encode()) logger.info("Send response: %s" str) # need to run only once to load model into memory reader = easyocr.Reader(['ch_sim' 'en']) factory = SimpleServerFactory(reader) factory.protocol = SimpleReceiver reactor.listenTCP(port factory) logger.info("TCP server started on port(s): %s ..." % (port)) reactor.run() def main(argv): port = 0 if len(argv) == 0: print('usage: ocr_server.py -p <port>') sys.exit(1) try: opts args = getopt.getopt(argv "?hp:" ["port="]) except getopt.GetoptError: print('usage: ocr_server.py -p <port>') sys.exit(2) if len(opts) == 0: print('usage: ocr_server.py -p <port>') sys.exit(3) for opt arg in opts: if opt == '-h': print('usage: ocr_server.py -p <port>') sys.exit() elif opt in ("-p" "--port"): port = arg else: print('usage: ocr_server.py -p <port>') sys.exit(4) if int(port) == 0: print('usage: ocr_server.py -p <port>') sys.exit(5) server(int(port)) if __name__ == '__main__': main(sys.argv[1:])

如何启动OCR engine呢?

python.exe ocr_engine.py usage: ocr_engine.py -p <port>

-p是指OCR engine所使用的端口号;

python.exe ocr_engine.py -p 8001 2020-11-04 18:08:23 224 - easyocr.easyocr - WARNING - CUDA not available - defaulting to CPU. Note: This module is much faster with a GPU. 2020-11-04 18:08:26 092 - __main__ - INFO - TCP server started on port(s): 8001 ...

这样就启动了一个在8001端口监听的OCR engine服务。

ocr文字识别算法(基于Python实现在线OCR文字识别系统)(3)

使用Django构建一个Web应用

urls.py

urlpatterns = [ path('' views.index) path('index.html' views.index) path('ocr.html' views.ocr) ]

html页面内容:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>OCR在线识别</title> <style type="text/css"> .upload_file { height: 100px; width: 800px; vertical-align:middle; } .upload_file form{ margin-top: 50px; margin-left: 50px; } .result { height: 100px; line-height: 100px; margin-left: 50px; font-size: 20px; } h2{ margin-top: 20px; margin-left: 50px; } </style> </head> <body> <h2>OCR在线识别系统</h2> <div class="upload_file"> <form action="/ocr.html" method="POST" enctype="multipart/form-data"> 上传图片: <input id="f" type="file" name="img"> <input type="hidden" name="csrf_token" value="{{ csrf_token }}" /> <input id="sub" type="submit" value="文字识别"> </form> </div> <div class="result"> <b>识别结果:</b> <b>{{ result }}</b> </div> </body> </html>

views.py

def index(request): result = "" return render(request "index.html" {"result": result}) def ocr(request): tcp_client_socket = socket(AF_INET SOCK_STREAM) tcp_client_socket.connect(('localhost' 9000)) img = request.FILES.get("img") data = img.read() tcp_client_socket.send(data) # 此处与udp不同,客户端已经知道消息来自哪台服务器,不需要用recvfrom了 recv_data = tcp_client_socket.recv(1024) result = recv_data.decode('utf-8') tcp_client_socket.close() return render(request "index.html" {"result": result})验证OCR识别效果

分别启动OCR engine和Django应用

python.exe ocr_engine.py -p 9000

在9000端口启动OCR engine。

python.exe manage.py runserver 8000 Run 'python manage.py migrate' to apply them. November 06 2020 - 16:04:55 Django version 3.1.3 using settings 'ocr-demo.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.

在8000端口启动Django系统。

ocr文字识别算法(基于Python实现在线OCR文字识别系统)(4)

在浏览器地址栏输入:http://localhost:8000

上传图片界面:

ocr文字识别算法(基于Python实现在线OCR文字识别系统)(5)

识别后效果:

ocr文字识别算法(基于Python实现在线OCR文字识别系统)(6)

测试图片:

ocr文字识别算法(基于Python实现在线OCR文字识别系统)(7)

视频演示效果:

如果您对本项目感兴趣,欢迎关注作者并后台私信“OCR”关键字,获取本项目源代码地址。

不积跬步,无以至千里;不积小流,无以成江海!

猜您喜欢: