当前位置: 首页 > 编程日记 > 正文

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读取图像文件,如果图像是不相容的,会先转换成兼容的格式,然后再提取图片中的文本信息。

copycode.gif

"""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

copycode.gif

3.pytesser使用在代码中加载pytesser模块,简单的测试代码如下:

copycode.gif

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

copycode.gif

052336254051665.png

识别结果如下:基本能将英文字符提取出来,但对一些复杂点的图片,比如说我尝试对一些英文论文图片进行识别,但结果实在不理想。

052339320921797.png

由于在中文识别方面还有很多问题,以后再进一步研究分享。

参考: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 端打开世纪佳…

使用邮件规则,将收到的邮件进行分类

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

多个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

经典八皇后问题 只写的最基本的&#xff0c;对称剪枝&#xff0c;位运算都没有用&#xff0c;以后有时间再看 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&#xff0c;端口号为8500 2、创建一个maven项目springcloud-consul&#xff0…

MySql按日期进行统计(前一天、本周、某一天)[转载]

转自&#xff1a;http://www.yovisun.me/mysql-date-statistics.html 在mysql数据库中&#xff0c;常常会遇到统计当天的内容。例如&#xff0c;在user表中&#xff0c;日期字段为&#xff1a;log_time 统计当天 sql语句为&#xff1a; select * from user where date(log_time…

右键新建里面没有word和excel_Windows10系统下如何将Sublime Text3添加到右键快捷菜单?...

由于本人用的Sublime Text是汉化绿色版的&#xff0c;不仅仅是因为绿色版免去了安装步骤 解压即用&#xff0c;还因为里面整合了常用的高效率必备插件&#xff0c;但是发现右键竟然没有用Sublime Text打开的快捷菜单&#xff0c;这对于我使用Sublime Text 打开一些代码文档会有…

NOI2011 道路修建

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

Wiener Filter

假设分别有两个WSS process&#xff1a;$x[n]$&#xff0c;$y[n]$&#xff0c;这两个process之间存在某种关系&#xff0c;并且我们也了解这种关系。现在我们手头上有process $x[n]$&#xff0c;目的是要设计一个LTI系统&#xff0c;使得系统输出$y[n]$&#xff0c;不过$y[n]$是…

c++ string replace_JAVA应用程序开发之String类常用API

【本文详细介绍了JAVA应用开发中的String类常用API&#xff0c;欢迎读者朋友们阅读、转发和收藏&#xff01;】1 基本概念API ( Application Interface 应用程序接口)是类中提供的接口&#xff0c;类库是类的集合。在 Java 语言中可以通过 import 关键字导入相关的类&#xff0…

强大的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 的产生&#xff0c;所以程式码跟 HTML 码混在一起写&#xff0c;正是 PHP 的特点也是优点&#xff0c;但正也造成很多分工上的问题&#xff0c;也就是你在写 php 的同时&#xff0c;你也必须很了解 前端、后端技能&#xff0c;像是 DataBase, H…

在java的程序里date类型比较大小

Date a; Date b; 假设现在你已经实例化了a和b a.after(b)返回一个boolean&#xff0c;如果a的时间在b之后&#xff08;不包括等于&#xff09;返回trueb.before(a)返回一个boolean&#xff0c;如果b的时间在a之前&#xff08;不包括等于&#xff09;返回truea.equals(b)返回一个…

linux安装ActiveMQ

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

用递归来判断输入的字符串是否是回文

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

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的应用详解

这里是三岁&#xff0c;来和大家唠唠自定义函数&#xff0c;这一个神奇的东西&#xff0c;带大家白话玩转自定义函数 自定义函数&#xff0c;编程里面的精髓&#xff01; def 自定义函数的必要函数&#xff1a;def 使用方法&#xff1a;def 函数名(参数1&#xff0c;参数2&…