Python中利用Tesseract软件来识别图片中的英文与中文

OCR与Tesseract介绍  

  将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR)。可以实现OCR 的底层库并不多,目前很多库都是使用共同的几个底层OCR 库,或者是在上面进行定制。
  Tesseract 是一个OCR 库,目前由Google 赞助(Google 也是一家以OCR 和机器学习技术闻名于世的公司)。Tesseract 是目前公认最优秀、最精确的开源OCR 系统。
  除了极高的精确度,Tesseract 也具有很高的灵活性。它可以通过训练识别出任何字体(只要这些字体的风格保持不变就可以),也可以识别出任何Unicode 字符。

Tesseract的安装与使用  

  Tesseract的Windows安装包下载地址为: http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-4.00.00dev.exe ,下载后双击直接安装即可。安装完后,需要将Tesseract添加到系统变量中。在CMD中输入tesseract -v, 如显示以下界面,则表示Tesseract安装完成且添加到系统变量中。

  识别简体中文,需要事先安装简体中文语言包,下载地址为:https://github.com/tesseract-ocr/tessdata/find/master/chi_sim.traineddata ,再讲chi_sim.traineddata放在C:\Program Files (x86)\Tesseract-OCR\tessdata目录下。

Python图像处理之图片验证码识别

  利用Tesseract软件来识别图片中的英文与中文,本文将具体介绍如何在Python中利用Tesseract软件来识别验证码(数字加字母)。

  本文将具体介绍如何利用Python的图像处理模块pillow和OCR模块pytesseract来识别上述验证码(数字加字母)。
    我们识别上述验证码的算法过程如下:

    1. 将原图像进行灰度处理,转化为灰度图像;
    2. 获取图片中像素点数量最多的像素(此为图片背景),将该像素作为阈值进行二值化处理,将灰度图像转化为黑白图像(用来提高识别的准确率);
    3. 去掉黑白图像中的噪声,噪声定义为:以该点为中心的九宫格的黑点的数量小于等于4;
    4. 利用pytesseract模块识别,去掉识别结果中的特殊字符,获得识别结果。

  完整的Python代码如下:

import os
import pytesseract
from PIL import Image
from collections import defaultdict

# tesseract.exe所在的文件路径
pytesseract.pytesseract.tesseract_cmd = ‘C://Program Files (x86)/Tesseract-OCR/tesseract.exe‘

# 获取图片中像素点数量最多的像素
def get_threshold(image):
    pixel_dict = defaultdict(int)

    # 像素及该像素出现次数的字典
    rows, cols = image.size
    for i in range(rows):
        for j in range(cols):
            pixel = image.getpixel((i, j))
            pixel_dict[pixel] += 1

    count_max = max(pixel_dict.values())  # 获取像素出现出多的次数
    pixel_dict_reverse = {v: k for k, v in pixel_dict.items()}
    threshold = pixel_dict_reverse[count_max]  # 获取出现次数最多的像素点

    return threshold

# 按照阈值进行二值化处理
# threshold: 像素阈值
def get_bin_table(threshold):
    # 获取灰度转二值的映射table
    table = []
    for i in range(256):
        rate = 0.1  # 在threshold的适当范围内进行处理
        if threshold * (1 - rate) <= i <= threshold * (1 + rate):
            table.append(1)
        else:
            table.append(0)
    return table

# 去掉二值化处理后的图片中的噪声点
def cut_noise(image):
    rows, cols = image.size  # 图片的宽度和高度
    change_pos = []  # 记录噪声点位置

    # 遍历图片中的每个点,除掉边缘
    for i in range(1, rows - 1):
        for j in range(1, cols - 1):
            # pixel_set用来记录该店附近的黑色像素的数量
            pixel_set = []
            # 取该点的邻域为以该点为中心的九宫格
            for m in range(i - 1, i + 2):
                for n in range(j - 1, j + 2):
                    if image.getpixel((m, n)) != 1:  # 1为白色,0位黑色
                        pixel_set.append(image.getpixel((m, n)))

            # 如果该位置的九宫内的黑色数量小于等于4,则判断为噪声
            if len(pixel_set) <= 4:
                change_pos.append((i, j))

    # 对相应位置进行像素修改,将噪声处的像素置为1(白色)
    for pos in change_pos:
        image.putpixel(pos, 1)

    return image  # 返回修改后的图片

# 识别图片中的数字加字母
# 传入参数为图片路径,返回结果为:识别结果
def OCR_lmj(img_path):
    image = Image.open(img_path)  # 打开图片文件
    imgry = image.convert(‘L‘)  # 转化为灰度图

    # 获取图片中的出现次数最多的像素,即为该图片的背景
    max_pixel = get_threshold(imgry)

    # 将图片进行二值化处理
    table = get_bin_table(threshold=max_pixel)
    out = imgry.point(table, ‘1‘)

    # 去掉图片中的噪声(孤立点)
    out = cut_noise(out)

    # 保存图片
    # out.save(‘E://figures/img_gray.jpg‘)

    # 仅识别图片中的数字
    # text = pytesseract.image_to_string(out, config=‘digits‘)
    # 识别图片中的数字和字母
    text = pytesseract.image_to_string(out)

    # 去掉识别结果中的特殊字符
    exclude_char_list = ‘ .:\\|\‘\"?![],()[email protected]#$%^&*_+-={};<>/¥‘
    text = ‘‘.join([x for x in text if x not in exclude_char_list])
    # print(text)

    return text

def main():
    # 识别指定文件目录下的图片
    # 图片存放目录figures
    dir = ‘E://figures‘

    correct_count = 0  # 图片总数
    total_count = 0  # 识别正确的图片数量

    # 遍历figures下的png,jpg文件
    for file in os.listdir(dir):
        if file.endswith(‘.png‘) or file.endswith(‘.jpg‘):
            # print(file)
            image_path = ‘%s/%s‘ % (dir, file)  # 图片路径

            answer = file.split(‘.‘)[0]  # 图片名称,即图片中的正确文字
            recognizition = OCR_lmj(image_path)  # 图片识别的文字结果

            print((answer, recognizition))
            if recognizition == answer:  # 如果识别结果正确,则total_count加1
                correct_count += 1

            total_count += 1

    print(‘Total count: %d, correct: %d.‘ % (total_count, correct_count))
    ‘‘‘
    # 单张图片识别
    image_path = ‘E://figures/code .jpg‘
    OCR_lmj(image_path)
    ‘‘‘

if __name__:
    main()

运行结果如下:

原文地址:https://www.cnblogs.com/chen8023miss/p/11445236.html

时间: 2024-10-14 04:49:38

Python中利用Tesseract软件来识别图片中的英文与中文的相关文章

如何通过迅捷OCR文字识别软件精准识别图片中的文字

怎样精准的将图片中的文字识别出来呢?相信这是很多人的烦恼,因为我们经常会遇到文字识别的时候,使用到的方法也有很多,但是很多方法识别出来的效果不是很好,需要对比着原图去改正,这就很令人烦恼了.下面小编将分享一种在图片文字识别软件中精准提取文字的方法,一起来学习下. 步骤一.文字识别的话需要使用到工具,可以打开电脑浏览器通过搜索迅捷OCR文字识别软件将其下载安装到电脑中去. 步骤二.将安装好的软件打开,关闭自动弹窗接着点击软件上上图片局部识别选项. 步骤三.进入图片局部识别选项后,点击添加文件按钮将

python中利用正则表达式匹配ip地址

现在有一道题目,要求利用python中re模块来匹配ip地址,我们应如何着手? 首先能想到的是ip地址是数字,正则表达式是如何匹配数字的呢? \d或[0-9] 对于这个问题,不要一下子上来就写匹配模式,应该一步步分解,把复杂的问题简单化 比如ip地址,我们可以总结一下规律 1. 它是一个字符串 2. 字符串内部是由4个1-3位的数字和3个.组成 3. 数字的范围是0-255 接下来,我们先试一下匹配第1个数字 第一步:尝试匹配192.168.100.123中的192 >>> import

python中使用Opencv进行人脸识别

上一节讲到人脸检测,现在讲一下人脸识别.具体是通过程序采集图像并进行训练,并且基于这些训练的图像对人脸进行动态识别. 人脸识别前所需要的人脸库可以通过两种方式获得:1.自己从视频获取图像   2.从人脸数据库免费获得可用人脸图像,如ORL人脸库(包含40个人每人10张人脸,总共400张人脸),ORL人脸库中的每一张图像大小为92x112.若要对这些样本进行人脸识别必须要在包含人脸的样本图像上进行人脸识别.这里提供自己准备图像识别出自己的方法. 1.采集人脸信息:通过摄像头采集人脸信息,10张以上

Python中利用xpath解析HTML

在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块(用来分析XML文档结构的,当然也能分析html结构), 利用其lxml.html的xpath对html进行分析,获取抓取信息: 首先,我们需要安装一个支持xpath的python库.目前在libxml2的网站上被推荐的python binding是lxml,也有beautifulsoup,不嫌麻烦的话还可以自己用正则表达式去构建,本文以lxml为例讲解. 假设有如下的HTML文档 1 <html> 2 &

Python中利用进度条求圆周率

从祖冲之到现在,圆周率的发展越来越丰富,求法也是越来越快其中: 1.求圆周率的方法: (1)蒙特卡罗法 这是基于“随机数”的算法,通过计算落在单位圆内的点与正方形内的比值来求圆周率PI. 如果一共投入N个点,其中有M个落入圆中,则要点均匀,假定圆周率的半径为R,则: (2)欧拉恒等式公式为: 基础的泰勒级数: (2)求python进度表 代码: #!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 18-5-21 下午3:44# @Autho

Python中利用for表达式创建列表

1.for表达式语法格式及用法 for表达式利用可迭代对象创建新的列表,for表达式也称为列表推导式,具体语法格式如下: [表达式 for 循环计数器 in 可迭代对象] 例: a = [ i + i for i in range(0,5) ] print (a) # 返回的是一个列表,打印 [0, 2, 4, 6, 8] 上面的例子中,range相当于包含5个元素(0,1,2,3,4),对表达式 i + i 执行5次,并且把5次执行的值收集起来作为新的列表元素. 2.for表达式添加if条件

python中利用少量代码快速实现从类对象中抽取所需属性的一种实践

项目中有可能会碰到这样一种场景: 根据一个id,查询得到和id对应的完整数据信息存储对象,比如书籍id到书籍详细信息,用户id到用户详细信息等,详细信息字段可能包括几十甚至上百个数据字段,真正需要返回给调用方的字段实际上却只占其中一小部分,这是出于性能和带宽的考虑(甚至在有些场景中,处于隐私或者安全考虑,强制要求不能返回非协议定义的信息字段,比如第三方登录一般只返回用户昵称.性别等少量信息),一般会从详细的数据对象中抽取出所需要的信息组装一个新的简化对象. 今天碰到这样一个问题,需要将一个存储多

Python中利用LSTM模型进行时间序列预测分析 - 预测爱尔兰的电力消耗

此示例中,神经网络用于使用2011年4月至2013年2月期间的数据预测都柏林市议会公民办公室的能源消耗. 每日数据是通过总计每天提供的15分钟间隔的消耗量来创建的. LSTM简介 LSTM(或长期短期存储器网络)允许分析具有长期依赖性的顺序或有序数据.当涉及到这项任务时,传统的神经网络不足,在这方面,LSTM将用于预测这种情况下的电力消耗模式. 与ARIMA等模型相比,LSTM的一个特殊优势是数据不一定需要是固定的(常数均值,方差和自相关),以便LSTM对其进行分析 - 即使这样做可能会导致性能

Python中利用tkinter模块构建图形用户界面GUI

1 >>> from tkinter import *; 2 >>> root=Tk() 3 >>> myLabel=Label(root,text="Hello world!"); 4 >>> myLabel.grid() 5 >>> root.mainloop() 先使用from tkinter import *;导入tkinter模块,输入上面的代码,出项GUI界面如上: