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简介OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。
随着云计算,大数据和AI技术的快速发展,OCR技术也相对比较成熟。在网络中也可以很方便地找到OCR识别软件,不管是离线工具还是在线识别,OCR识别率还是蛮高的。
一个普通的OCR识别软件大致的工作流程如下:
- 影像输入;
- 影像前处理;
- 文字特征抽取;
- 比对识别;
- 人工校正;
- 结果输出;
对待识别图像进行如下预处理,可以降低特征提取算法的难度,并能提高识别的精度:
- 二值化:由于彩色图像所含信息量过于巨大,在对图像中印刷体字符进行识别处理前,需要对图像进行二值化处理,使图像只包含黑色的前景信息和白色的背景信息,提升识别处理的效率和精确度。
- 图像降噪:由于待识别图像的品质受限于输入设备、环境、以及文档的印刷质量,在对图像中印刷体字符进行识别处理前,需要根据噪声的特征对待识别图像进行去噪处理,提升识别处理的精确度。
下面我们通过python开发一个OCR在线识别系统,该系统提供一个简单的web界面,支持上传一张包含中文字符的图片,经过系统的识别后,可以提取出图片中包含的文字,并将文字输出到web界面。
OCR在线识别系统特性:
- 在线识别功能;
- OCR engine提供socket服务;
- 可以支持TCP Server模式;
- 也可以支持命令行模式;
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服务。
使用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系统。
在浏览器地址栏输入:http://localhost:8000
上传图片界面:
识别后效果:
测试图片:
视频演示效果:
如果您对本项目感兴趣,欢迎关注作者并后台私信“OCR”关键字,获取本项目源代码地址。
不积跬步,无以至千里;不积小流,无以成江海!