RJ博客

Python:利用pytesser识别简单图形验证码

本文目录

Python利用pytesser识别简单图形验证码

https://my.oschina.net/jhao104/blog/647326

Windows按照这篇博客操作基本没问题,需要注意的是:

1. pytesser是基于tesseract实现的(其实就是通过subprocess模块让tesseract易于调用),所以需要将tesseract.exe所在的路径配置到系统环境变量。如果不配置,则需要把pytesser.py文件的tesseract_exe_name变量的值改为tesseract.exe所在的路径, 否则会报错。例如:

tesseract_exe_name = 'F:\python64\Lib\site-packages\pytesser\\tesseract' 
(原值为'tesseract',注意window下斜杠的转义问题)

2. 为了方便调用,pytesser包都是放在python目录下的site-packages里面。

Linux解决思路类似,默认安装tesseract的时候已配合好 /usr/local/bin/tesseract,所以Linux一般情况下不用修改tesseract_exe_name的值。


Linux安装没Windows方便,安装完毕后还需要:

1. 配置语言文件的文件夹

默认安装下存放语言文件的文件夹为 /usr/local/share/tessdata

修改配置的变量 export TESSDATA_PREFIX=/usr/local/share/

注意这里修改的是路径前缀,真实语言文件路径实际 /usr/local/share/tessdata

2. 到 https://github.com/tesseract-ocr/tessdata 下载对应的语言文件放进去

image.png

--------------------------------------------------------------------------------------

命令行使用: tesseract image.png out -l chi_sim

--------------------------------------------------------------------------------------

英文测试上面教程链接里面有,就不重复测了,测测中文识别,以这个图片为例:

545 [4].png

运行:

image.png

如上所示,"参考资料"能被正常识别出来。


pytesser.py想要使用多语言的话还得对应修改下函数,添加language参数,如下:

# -*- coding: utf-8 -*-

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

from PIL import Image
import subprocess

import util
import errors

tesseract_exe_name = 'tesseract' # Name of executable to be called at command line
#tesseract_exe_name = '/usr/local/bin/tesseract' 
#tesseract_exe_name = 'F:\python64\Lib\site-packages\pytesser\\tesseract'
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 = True  # Temporary files cleaned up after OCR operation

def call_tesseract(input_filename, output_filename, language='eng'):
	"""Calls external tesseract.exe on input file (restrictions on types),
	outputting output_filename+'txt'"""
	args = [tesseract_exe_name, input_filename, output_filename, "-l", language]
	proc = subprocess.Popen(args)
	retcode = proc.wait()
	if retcode!=0:
		errors.check_for_errors()

def image_to_string(im, cleanup = cleanup_scratch_flag, language='eng'):
	"""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, language)
		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, language='eng'):
	"""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, language)
			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('545.png')
	imgry = im.convert('L')

	threshold = 140
	table = []
	for i in range(256):
	    if i < threshold:
	        table.append(0)
	    else:
	        table.append(1)
	out = imgry.point(table, '1')

	text = image_to_string(out, language='chi_sim')
	print text.decode('utf-8')


	im = Image.open('phototest.tif')
	text = image_to_string(im, language='eng')
	print text
	try:
		text = image_file_to_string('fnord.tif', graceful_errors=False, language='eng')
	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, language='eng')
	print "fnord.tif contents:", text
	text = image_file_to_string('fonts_test.png', graceful_errors=True, language='eng')
	print text

实际使用过程中,对图像先进行灰度值和二值化处理,识别率能提高些,不过对于中文识别率还不是很高,要提高识别率要自己训练下tesseract。




REF:

https://my.oschina.net/jhao104/blog/647326

http://blog.csdn.net/hk_jh/article/details/8961449  多语言使用

http://www.jianshu.com/p/1945245cd664  训练tesseract


https://www.oschina.net/question/54100_59400

http://blog.csdn.net/diandianxiyu_geek/article/details/50522582  安装

http://www.zmonster.me/2015/04/17/tesseract-install-usage.html

相关推荐

发表评论