1 对图片进行二值化处理

二值化就是将图片的颜色转换成非黑即白的图片

from PIL import Imageim = Image.open('yzm.jpg')  # 用pil打开这个图片
im = im.convert('L')  # 将图像转换为“L”模式, 即黑白。
yuzhi = 127  # 根据需要自行更改阈值
im = im.point(lambda x: 0 if x < yuzhi else x >= yuzhi, '1')  # 二值化 127为分割灰度的点(阀值)
im.show()  # 查看图片

图片资源:

经过上述处理应该这样的生成图片:

如果显示的图片效果不理想,可以调整阀值来进行调整(但是依然会留有小黑点)

2 去除噪点

把图片中的黑点去掉

from PIL import ImageDraw, Imagedef getPixel(image, x, y):"""去除黑点:param image: 图片路径:param x: 像素点x轴坐标:param y: 像素点y轴坐标:return:"""L = image.getpixel((x, y))  # 获取当前像素点的像素if L == 0:  # 判读此像素点是否为黑,因为如果是白的就没必要处理了nearDots = 0  # 初始化记录周围有没有黑像素数量的值# 判断周围像素点(白色 +1)for i in range(1, 4):  # 根据点的大小自行选择周围像素点层数# try 防止越界try:if L - image.getpixel((x - i, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x - i, y)):nearDots += 1except:passtry:if L - image.getpixel((x - i, y + i)):nearDots += 1except:passtry:if L - image.getpixel((x, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x, y + i)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y + i)):nearDots += 1except:pass# 根据需求自行调节if nearDots > 16:  # 这里如果周围16个是白点那么就返回一个白点,实现去黑点的操作return 1  # 返回白点else:return 0  # 返回黑点else:return 1def clearNoise(image):"""清除噪点"""draw = ImageDraw.Draw(image)# 循环遍历每个像素点for x in range(0, image.size[0]):for y in range(0, image.size[1]):color = getPixel(image, x, y)draw.point((x, y), color)return imageif __name__ == '__main__':im = Image.open("./yzm_gai.png")im = clearNoise(im)im.show()

经过上述处理应该这样的生成图片:

3 OCR识别

import pytesseractfrom PIL import Imageimage = Image.open('yzm_gai.png')
# chi_sim 是中文识别包,equ 是数学公式包,eng 是英文包
code = pytesseract.image_to_string(image, lang="chi_sim")
print(code)

识别结果:

M8K2

成功,完美!!!

虽然本次识别成功,并不代表每次都可以识别成功,对于较复杂的验证码识别成功率更低,那该怎么办呢???

当然是训练!!!(待续。。。)

完整代码:

import pytesseract
from PIL import Image, ImageDrawdef img_to_L(img_path):"""将图片转化为非黑即白的图片:param img_path: 图片路径:return:"""im = Image.open(img_path)  # 用pil打开这个图片im = im.convert('L')yuzhi = 127im = im.point(lambda x: 0 if x < yuzhi else x >= yuzhi, '1')  # 二值化 100为分割灰度的点(阀值),二值化就是将图片的颜色转换成非黑即白的图片im.show()return imdef getPixel(image, x, y):"""去除黑点:param image: 图片路径:param x: 像素点x轴坐标:param y: 像素点y轴坐标:return:"""L = image.getpixel((x, y))  # 获取当前像素点的像素if L == 0:  # 判读此像素点是否为黑,因为如果是白的就没必要处理了nearDots = 0  # 初始化记录周围有没有黑像素数量的值# 判断周围像素点(白色 +1)for i in range(1, 4):try:if L - image.getpixel((x - i, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x - i, y)):nearDots += 1except:passtry:if L - image.getpixel((x - i, y + i)):nearDots += 1except:passtry:if L - image.getpixel((x, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x, y + i)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y + i)):nearDots += 1except:passif nearDots > 16:  # 这里如果周围10个是白点那么就返回一个白点,实现去黑点的操作return 1  # 返回白点else:return 0  # 返回黑点else:return 1def clearNoise(image):"""清除噪点:param image: 图像路径:return: """draw = ImageDraw.Draw(image)# 循环遍历每个像素点for x in range(0, image.size[0]):for y in range(0, image.size[1]):color = getPixel(image, x, y)draw.point((x, y), color)return imagedef OCR(im):# chi_sim 是中文识别包,equ 是数学公式包,eng 是英文包code = pytesseract.image_to_string(im, lang='eng')return codeif __name__ == '__main__':# 图像路径im = "yzm.jpg"# # 将图片转化为非黑即白的图片im = img_to_L(im)# 将上一步处理完成的im对象传给clearNoise()函数im = clearNoise(im)im.show()# 进行OCR识别code = OCR(im)print(code)

Python Tesseract-orc 识别简单验证码相关推荐

  1. python代码标识码_代码分享:使用Python和Tesseract来识别图形验证码

    原标题:代码分享:使用Python和Tesseract来识别图形验证码 *本文原创作者:ipenox,本文属FreeBuf原创奖励计划,未经许可禁止转载 各位在企业中做Web漏洞扫描或者渗透测试的朋友 ...

  2. python123九宫格输入_使用python PIL库实现简单验证码的去噪方法步骤

    字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的. 想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括: ...

  3. 一种识别简单验证码的方法

    本文主要讲述了一种识别简单验证码的方法,本文重点不是识别这些简单的数字,而是通过识别数字这个过程理解到图片的数字构造.任何一张图片都是由三个图层构成的,每个图层是一张二维矩阵表,三张表上位置相同的三个 ...

  4. python识别中文验证码_Python识别简单验证码

    12.1 更新 已经有完整的代码了 ======================================= 新手, 多多指教 大概思路: 1. 转换图片为黑白, 2. 去除干扰, 3. 切割, ...

  5. python实现OCR识别图片验证码

    用cv2模块读取和显示模块 #导包cv2拓展模块 import cv2#先给窗体起名字 cv2.namedWindow("ShowImage1") cv2.namedWindow( ...

  6. Python Tesseract 图片识别-小操练

    小科普 光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息. Tesseract的OCR引擎最先由 ...

  7. 使用Python PIL库实现简单验证码的去噪处理

    想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括:将彩色图片转换成灰度图.将灰度图二值化和去除噪点三个基本过程.这里仅以比较简单的验证码为例, ...

  8. python3识别简单验证码

    准备工作 1.下载OCR识别库tesseract ,下载地址:https://digi.bib.uni-mannheim.de/tesseract/,根据自己的系统选择合适的版本. 2.下载完成后执行 ...

  9. Tesseract图文识别--简单

    下载该安装包,安装tesseract, 安装之后 配置环境变量,将安装路径与路径下的tessdata路径放到边境变量的path下 D:\installed_study_software\tessera ...

  10. 使用pytesseract识别简单验证码

    from PIL import Image import pytesseract from pytesseract import *rep={'O':'0', #替换列表'I':'1','L':'1' ...

最新文章

  1. 数字货币 BCH的混币神器CashShuffle
  2. 64位虚拟机安装64位ubuntu出现问题
  3. luogu P2679——子串
  4. 【生成函数基础题】hdu1085 hdu1028
  5. java中实现选择文件_Java实现选择文件并显示文件内容代码
  6. 每天一道LeetCode-----将单词数组分成多行,每行长度相同,单词之间用空格分隔,要求空格尽量均匀分布
  7. 双向控制引脚的控制代码
  8. ffmpeg加环境变量
  9. javabeans_膨胀的JavaBeans –不要在您的API中添加“ Getters”
  10. C语言标识符、关键字和注释
  11. Android中数据的存储操作
  12. csgo天津服务器维护怎么办,CSGO华北赛区在天津落下帷幕
  13. Smarty中文手册
  14. java 数据字典使用_java中数据字典怎么用?图文详解
  15. (转)一个偷食禁果的女孩--一件我亲眼目睹的真实感人故事
  16. 【C语言基础学习笔记】一、初始C语言(2)
  17. java大文件md5快速计算_java 计算文件MD5值 大文件
  18. vue 使用qrcode生成二维码功能
  19. 计算机没有有效的ip配置,win7电脑没有有效的ip配置怎么办
  20. 还原《魔兽争霸3》场景全过程

热门文章

  1. 如何用java获取网页源代码
  2. 刻录光驱不能访问出现函数不正确问题解决
  3. 为什么程序员喜欢养猫?
  4. netty系列之:真正的平等–UDT中的Rendezvous
  5. collect2: error: ld returned 1 exit status(解决方案大总结)
  6. 当yum安装包时显示系统空间不足,求指教
  7. leetcode **773. 滑动谜题(拼图)(2021.6.26)
  8. 5.学城项目 支付宝支付
  9. antd 时间选择器,设置显示为中文
  10. 13946 问题 E: 积木游戏