python利用自动识别写模块_Python 利用pytesser模块识别图像文字
使用的是python的pytesser模块,原先想做的是图片中文识别,搞了一段时间了,在中文的识别上还是有很多问题,这里做记录分享。
可将图片中的文字转换成文本(主要是英文)。
1.pytesser安装
使用设备:win8 64位
PyTesser使用Tesseract OCR引擎,将图像转换到可接受的格式,然后执行tesseract提取出文本信息。使用PyTesser ,你无须安装Tesseract OCR引擎,但必须要先安装PIL模块(Python Image Library,python的图形库)
其中PIL可直接点击exe安装,pytesser无需安装,解压后可以放在python安装文件夹的\Lib\site-packages\ 下直接使用(需要添加pytesser.pth)
Ubuntu安装
sudo pip install pytesseract
sudo apt-get install tesseract-ocr
2.pytesser源码
通过查看pytesser.py的源码,可以看到几个主要函数:
(1)call_tesseract(input_filename, output_filename)
该函数调用tesseract外部执行程序,提取图片中的文本信息
(2)image_to_string(im, cleanup = cleanup_scratch_flag)
该函数处理的是image对象,所以需用使用im = open(filename)打开文件,返回一个image对象。其中调用util.image_to_scratch(im, scratch_image_name)将内存中的图像文件保存为bmp,以便tesserac程序能正常处理。
(3)image_file_to_string(filename, cleanup = cleanup_scratch_flag, graceful_errors=True)
该函数直接使用Tesseract读取图像文件,如果图像是不相容的,会先转换成兼容的格式,然后再提取图片中的文本信息。
"""OCR in Python using the Tesseract engine from Google
http://code.google.com/p/pytesser/
by Michael J.T. O'Kelly
V 0.0.1, 3/10/07"""
import Image
import subprocess
import util
import errors
tesseract_exe_name = 'tesseract' # Name of executable to be called at command line
scratch_image_name = "temp.bmp" # This file must be .bmp or other Tesseract-compatible format
scratch_text_name_root = "temp" # Leave out the .txt extension
cleanup_scratch_flag = False # Temporary files cleaned up after OCR operation
def call_tesseract(input_filename, output_filename):
"""Calls external tesseract.exe on input file (restrictions on types),
outputting output_filename+'txt'"""
args = [tesseract_exe_name, input_filename, output_filename]
proc = subprocess.Popen(args)
retcode = proc.wait()
if retcode!=0:
errors.check_for_errors()
def image_to_string(im, cleanup = cleanup_scratch_flag):
"""Converts im to file, applies tesseract, and fetches resulting text.
If cleanup=True, delete scratch files after operation."""
try:
util.image_to_scratch(im, scratch_image_name)
call_tesseract(scratch_image_name, scratch_text_name_root)
text = util.retrieve_text(scratch_text_name_root)
finally:
if cleanup:
util.perform_cleanup(scratch_image_name, scratch_text_name_root)
return text
def image_file_to_string(filename, cleanup = cleanup_scratch_flag, graceful_errors=True):
"""Applies tesseract to filename; or, if image is incompatible and graceful_errors=True,
converts to compatible format and then applies tesseract. Fetches resulting text.
If cleanup=True, delete scratch files after operation."""
try:
try:
call_tesseract(filename, scratch_text_name_root)
text = util.retrieve_text(scratch_text_name_root)
except errors.Tesser_General_Exception:
if graceful_errors:
im = Image.open(filename)
text = image_to_string(im, cleanup)
else:
raise
finally:
if cleanup:
util.perform_cleanup(scratch_image_name, scratch_text_name_root)
return text
if __name__=='__main__':
im = Image.open('phototest.tif')
text = image_to_string(im)
print text
try:
text = image_file_to_string('fnord.tif', graceful_errors=False)
except errors.Tesser_General_Exception, value:
print "fnord.tif is incompatible filetype. Try graceful_errors=True"
print value
text = image_file_to_string('fnord.tif', graceful_errors=True)
print "fnord.tif contents:", text
text = image_file_to_string('fonts_test.png', graceful_errors=True)
print text
3.pytesser使用在代码中加载pytesser模块,简单的测试代码如下:
from pytesser import *
im = Image.open('fonts_test.png')
text = image_to_string(im)
print "Using image_to_string(): "
print text
text = image_file_to_string('fonts_test.png', graceful_errors=True)
print "Using image_file_to_string():"
print text
识别结果如下:基本能将英文字符提取出来,但对一些复杂点的图片,比如说我尝试对一些英文论文图片进行识别,但结果实在不理想。
由于在中文识别方面还有很多问题,以后再进一步研究分享。
参考:HK_JH的专栏 http://blog.csdn.net/hk_jh/article/details/8961449
相关文章:

C02-程序设计基础提高班(C++)第9周上机任务-类和对象
第9周:阅读教材第8章(p231-262),主要内容是类和对象,学会定义类和对象解决问题,完成第9周上机任务;(回到C02-程序设计基础提高班(C)学习安排)实践任务:【任务…

在不影响配置下,清除netscreen密码
在缺省情况下,设备恢复特征被启用。可通过输入 unset admin device-reset 命令禁用它。同样,如果NetScreen 设备处于 FIPS 模式,恢复特征被自动禁用。1. 在登录提示下,键入设备的序列号。2. 在密码提示下,再次键入序列…

如何删除一个CSDN上自己上传的资源
如何删除一个CSDN上自己上传的资源 第一步,找到你想删除的资源,其URL举例为:http://download.csdn.net/detail/ssergsw/9733040则删除的get请求为:http://download.csdn.net/index.php/user_console/del_my_source/9733040删除成功…

关于计算机中二进制原码,反码,补码的简要解释
原码,补码,反码的概念 正数原码:正数的原码为取绝对值的数转二进制,5的原码为 00000000 00000000 00000000 00000101 负数原码:负数的原码为取绝对值的数转二进制,然后符号位(最高位&a…

python是一种面向对象的高级语言_爬了世纪佳缘后发现了一个秘密,世纪佳缘找对象靠谱吗?...
今天在知乎上看到一个关于【世纪佳缘找对象靠谱吗?】的讨论,其中关注的人有 1903,被浏览了 1940753 次,355 个回答中大多数都是不靠谱。用 Python 爬取世纪佳缘的数据是否能证明它的不靠谱?数据抓取 在 PC 端打开世纪佳…

使用邮件规则,将收到的邮件进行分类
随着工作的进行,我们经常会发现邮箱里一大堆各种各样的邮件,而要从中找到指定类型的邮件,只能每次都进行一次搜索。但是,经常这样搜索,先不说效率如何,它肯定会对我们的工作进行一些影响。 在这里ÿ…

多个CALayer的联动
在如何通过手势捕获CALayer基础上做了个示例,两个CALayer的联动,当拖动左侧的Layer的时候,右侧的Layer随动。因为右侧的动画没有关闭,有延迟,产生随动的效果。如果不想延迟,可参考拖动动画的问题及解决。 在…

在不允许新建对象的条件下,将list中指定条件的值去除
package com.liujianwang.learning;import java.util.LinkedList; import java.util.List;public class ListTest {public static void main(String[] args) {/** 在不允许新建对象的条件下,将list中指定条件的值去除。* 例如:移除list中值大于6的元素。…

openlayers map获取全部feature_tf2.0基础-tf.data与tf.feature_column
7.2.1 tf.data使用 tf.data API 可以轻松处理大量数据、不同的数据格式以及复杂的转换。tf.data API 在 TensorFlow 中引入了两个新的抽象类:tf.data.Dataset 表示一系列元素,其中每个元素包含一个或多个 Tensor 对象。:创建来源(…

项目活动定义 概述
项目活动定义概述 项目活动定义是确认和描述项目的特定活动,它把项目的组成要素加以细分为可管理的更小部分,以便更好地管理和控制。 确定计划活动需要确定和记载计划完成的工作。活动定义过程识别处于工作分解结构(WBS)最下层,叫…

如何判断CPU、内存、磁盘的性能瓶颈?
1.如何判断CPU、内存、磁盘的瓶颈? CPU瓶颈 1) 查看CPU利用率。建议CPU指标如下 a) User Time:65%~70% b) System Time:30%~35% c) Idle:0%~5% 如果us,sy高于这个指标可以判断CPU有瓶颈 使用top…

一个苹果手机移动电源也能让他拽得跟二五八万似的
一个苹果手机移动电源也能让他拽得跟二五八万似的~~低调一定是美德,尤其是在见过各种JP人类之后,我真心在心里呐喊,你丫稍微低调一点会死啊!!!是的,这个世界上不可能不存在拽得调子高的人&#…

Confluence 6 配置服务器基础地址
服务器基础地址(Server Base URL)是用户访问 Confluence 的 URL 地址。这个基础的 URL 地址必须与你在浏览器中访问 Confluence 中的地址。 Confluence 将会在安装的时候自动侦测基础的 URL,但是如果你的站点 URL 修改了,或者你的…

python gui编程框架添加工具栏_python gui编程,我是初学者。用tk,制作下拉菜单的command不分我想打开另一个界面。如和解决,求解!!...
展开全部 from tkinter import * def new_file(): print("Open new file") def open_file(): print("Open existing file") def stub_action(): print("Menu select") def makeCommandMenu(): CmdBtn Menubutton(mBar, textButton Commands, un…

这样在一个sql里完成更新和插入,只用一次数据库连接,效率提高了
代码如下,请给出具体修改代码 public void AddCategory(string nCategoryName, int nImgId, int nBelongToId, int nShopId, int nSortId) { int CategoryId 0; string cmdText "Select top 1 CategoryId from ProductCategory where Categ…

USACO Section 1.5 Checker Challenge
经典八皇后问题 只写的最基本的,对称剪枝,位运算都没有用,以后有时间再看 1 /* ID:linyvxi1 2 PROB:checker 3 LANG:C 4 */ 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 int N; 9 int tota…

使用JavaScript实现在页面上所有内容加载完之前一直显示loading...页面
Html 1 <body class"is-loading">2 <div class"curtain">3 <div class"loader">4 loading...5 </div>6 </div> 7 <div>8 <!--这里 正文 -->9 </div> 10 </body> …

SpringCloud + Consul服务注册中心 + gateway网关
1 启动Consul 2 创建springcloud-consul项目及三个子模块 2.1 数据模块consul-producer 2.2 数据消费模块consul-consumer 2.3 gateway网关模块 3 测试及项目下载 1、首先安装Consul并启动Consul,端口号为8500 2、创建一个maven项目springcloud-consul࿰…

MySql按日期进行统计(前一天、本周、某一天)[转载]
转自:http://www.yovisun.me/mysql-date-statistics.html 在mysql数据库中,常常会遇到统计当天的内容。例如,在user表中,日期字段为:log_time 统计当天 sql语句为: select * from user where date(log_time…

右键新建里面没有word和excel_Windows10系统下如何将Sublime Text3添加到右键快捷菜单?...
由于本人用的Sublime Text是汉化绿色版的,不仅仅是因为绿色版免去了安装步骤 解压即用,还因为里面整合了常用的高效率必备插件,但是发现右键竟然没有用Sublime Text打开的快捷菜单,这对于我使用Sublime Text 打开一些代码文档会有…

NOI2011 道路修建
题目连接:http://221.192.240.123:8586/JudgeOnline/showproblem?problem_id1670 题意自便。 相关知识:树的遍历,非递归DFS写法。 分析:因为树的边给定,所以从哪个点开始求都是一样的。递归求出每个点的的子树个数&am…

Wiener Filter
假设分别有两个WSS process:$x[n]$,$y[n]$,这两个process之间存在某种关系,并且我们也了解这种关系。现在我们手头上有process $x[n]$,目的是要设计一个LTI系统,使得系统输出$y[n]$,不过$y[n]$是…
c++ string replace_JAVA应用程序开发之String类常用API
【本文详细介绍了JAVA应用开发中的String类常用API,欢迎读者朋友们阅读、转发和收藏!】1 基本概念API ( Application Interface 应用程序接口)是类中提供的接口,类库是类的集合。在 Java 语言中可以通过 import 关键字导入相关的类࿰…

强大的Charles的使用,强大的flutter1.9
<a href"http://www.cocoachina.com/articles/37551?filterios"> 强大的Charles强大的flutter转载于:https://www.cnblogs.com/henusyj-1314/p/11586350.html

多层次架构设计前言
因为 php 原生来就是要辅助 HTML 的产生,所以程式码跟 HTML 码混在一起写,正是 PHP 的特点也是优点,但正也造成很多分工上的问题,也就是你在写 php 的同时,你也必须很了解 前端、后端技能,像是 DataBase, H…

在java的程序里date类型比较大小
Date a; Date b; 假设现在你已经实例化了a和b a.after(b)返回一个boolean,如果a的时间在b之后(不包括等于)返回trueb.before(a)返回一个boolean,如果b的时间在a之前(不包括等于)返回truea.equals(b)返回一个…

linux安装ActiveMQ
1. 下载: # wget https://archive.apache.org/dist/activemq/5.14.0/apache-activemq-5.14.0-bin.tar.gz 2. 解压: # tar zxvf apache-activemq-5.14.0-bin.tar.gz -C ../ 3. 配置环境变量: # vim /etc/profile 4. 启动: # active…

用递归来判断输入的字符串是否是回文
设计思路:导入Scanner类输入字符串,再将输入的字符串转化为字符数组,然后从字符串左右两侧依次比较字符chu是否相同,若相同递归返回读取的字符个数,若返回字符的个数输入字符串的长度,则输出该字符串是回文…

js高级程序设计之跨浏览器事件处理
//事件 var EventUtil { //添加事件 addHandler:function (element, type, handler) { //element:DOM对象,type:事件类型,handler:事件函数 if (element.addEventListener) { //是否存在DOM2级方法 element.addEventListener(type, handler, false); } else if (element.attac…

在python中使用关键字define定义函数_python自定义函数def的应用详解
这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2&…