文章目录

  • 一、image库基础使用
  • 二、验证码识别

一、image库基础使用

#coding:utf-8#典型应用:
>>> from PIL import Image
>>> im = Image.open('/Users/Ezy/Documents/Test/image/test.jpg')
>>> print im.format, im.size, im.mode
JPEG (440, 330) RGB
#size元组表示宽和高,mode表示RGB(true color image),此外还有,L(luminance),CMTK(pre-press image)
>>> im = im.convert('L')    #转为灰度模式
>>> im.show()
>>> pix = im.load()
>>> pix[0,1]
255#新建一个空白的图片
>>> from PIL import Image
>>> im = Image.new('1', (100, 100), 'white')
#或者
>>> im = Image.new('1', (100, 100), 255)        #255表示白色,1表示黑色
>>> im.show()
>>> im = Image.new('L', (100, 100), 128)
>>> im.show()
>>> im = Image.new('RGBA', (100, 100), (12,34,23,1))
>>> im.show()               #将图片展现出来
"""
new方法可以创建图片对象,new参数说明:
第一个参数:指定模式:
L:灰度模式,每个像素的颜色使用 0-255 的整数表示。
1:表示单色模式
RGBA:三元色加透明度的表示方式,每个像素的颜色使用类似 (12,34,23,1) 的 tuple 表示。
第二个参数:指定图片大小
第三个参数:指定背景色
"""#新建一个带文字的图片
from PIL import Image
from PIL import ImageDraw
>>> im = Image.new('1', (100, 100), 'white')
>>> draw = ImageDraw.Draw(im)
>>> draw.text((0, 0), 'hello world!')
#两个参数,第一个是字母开始的位置,第二个为输入的内容,可以新增第三个参数,font=FONT,来指定字体
>>> draw.text((wdraw, hdraw), msgNum, font=fron, fill=(255, 33, 33))
#定义图像格式#(wdraw, hdraw):坐标#msgNum: 随机数# font: 自定义字体及大小# fill:定义颜色,可以为数字格式也可以直接指定英文如:fill="red"
>>> im.show()#图片处理
>>> im = Image.open('test.jpg')
>>> box = (100, 100, 200, 200)
>>> region = im.crop(box)               #将图片扣出来一块内容
>>> region.show()                       #展示抠出来的图片
>>> region = region.transpose(Image.ROTATE_180)     #将抠出来的图片旋转180度
>>> region.show()                       #展示旋转后的图片
>>> im.paste(region, box)               #将旋转后的图片放回原来的区域中
>>> im.show()                       #展示图片
#crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。#图片的其他操作:
>>> out = im.resize((128, 128))                     #压缩原图片
>>> out = im.rotate(45)                             #逆时针旋转 45 度角。
>>> out = im.transpose(Image.FLIP_LEFT_RIGHT)       #左右对换。
>>> out = im.transpose(Image.FLIP_TOP_BOTTOM)       #上下对换。
>>> out = im.transpose(Image.ROTATE_90)             #旋转 90 度角。
>>> out = im.transpose(Image.ROTATE_180)            #旋转 180 度角。
>>> out = im.transpose(Image.ROTATE_270)            #旋转 270 度角。
>>> out.show()                                      #展示处理后的图片#图像增强
>>> import ImageFilter
>>> imfilter = im.filter(ImageFilter.DETAIL)
>>> imfilter.show()#取出某个图像中某个点的RGB值:
>>> im = Image.open('/Users/Ezy/Documents/Test/image/test.jpg')
>>> pix = im.load()
>>> print pix[1,2]
0
>>> print pix[1,3]
8#更改某个图像中某个点的RGB值:
>>> from PIL import Image
>>> im = Image.open('/Users/Ezy/Documents/Test/image/test.jpg')
>>> im = im.convert('L')
>>> pix = im.load()
>>> pix[0,1]
23
>>> im.putpixel((0,1), 0)
>>> pix[0,1]
0
#注意,此时改变还只是对im对象的改变,要想生效就需要保存图片,如下所示
>>> im.save('/Users/Ezy/Documents/Test/image/test2.jpg')

补充:图片几种色彩模式

  • 灰度(黑白)
  • RGB(三色)
  • CMYK(印刷色)
  • Lab(肉眼识别色)

二、验证码识别

首先需要安装Tesseract-OCR软件,参考:

Windows安装Tesseract-OCR 4.00并配置环境变量,下载一下安装包,安装一下然后配置下一环境变量

然后需要安装python库

pip install pytesseract
pip install pillow

然后就开始验证码识别啦,先来一个简单的验证码识别,没有干扰

import pytesseract
from PIL import Imageimage = Image.open("./1.png")
code = pytesseract.image_to_string(image)
print(code)

效果如下

但是像这种有干扰的就不行了,识别不出来

我们需要进行去噪,代码如下

#coding:utf-8
#auther:Ezy
#statement:使用image函数来自定义去除干扰线"""
选择验证码颜色
1、颜色数目太少
2、范围太大,61>x2-x1>9, y2-y1 <11
3、若干扰线也在范围内,选择像素点数目多的
"""from PIL import Image
from pytesseract import *           #若要正常使用需要首先安装好tesseract-ocr,否则会报错
import requestsdef scan(im, xx, yy):pix = im.load()dic = {}            #{23:{'count':1, 'left':0, 'right':0, 'up':1, 'down':1}, ……}for x in range(xx):for y in range(yy):if pix[x,y] in dic.keys():dic[pix[x,y]]['count'] = dic[pix[x,y]]['count'] + 1if x > dic[pix[x,y]]['right']:dic[pix[x,y]]['right'] = xif x < dic[pix[x,y]]['left']:dic[pix[x,y]]['left'] = xif y > dic[pix[x,y]]['up']:dic[pix[x,y]]['up'] = yif y < dic[pix[x,y]]['down']:dic[pix[x,y]]['down'] = yelse:dic[pix[x,y]] = {'count':1, 'left':x, 'right':x, 'up':y, 'down':y}return dicdef geticode(dic):l = []for i in dic.keys():if 9 < abs(dic[i]['right']-dic[i]['left']) < 61 and abs(dic[i]['up']-dic[i]['down']) < 11:l.append(i)tmp = 0         #验证码颜色for i in l:# print(str(i) + '\t' + str(dic[i]))if dic[i]['count'] > tmp:tmp = i# print(str(tmp) + '\t' + str(dic[tmp]))return tmpdef clean(im, xx, yy, icode):pix = im.load()for x in range(xx):for y in range(yy):if pix[x,y] != icode:im.putpixel((x,y), 255)return imdef main(file):im = Image.open(file)im = im.convert('L')xx, yy = im.sizeicode = geticode(scan(im, xx, yy))im = clean(im, xx, yy, icode)# im.show()test = image_to_string(im)print(test)if __name__ == "__main__":file = "./2.gif"main(file)

效果如下

具体步骤:
先将图片转换为灰度模式

im = im.convert('L')

转换后就像下面这种

然后遍历每个像素,把颜色相同的放在一起,并计算出这个颜色的范围

    for x in range(xx):for y in range(yy):if pix[x, y] in dic.keys():dic[pix[x, y]]['count'] = dic[pix[x, y]]['count'] + 1if x > dic[pix[x, y]]['right']:dic[pix[x, y]]['right'] = xif x < dic[pix[x, y]]['left']:dic[pix[x, y]]['left'] = xif y > dic[pix[x, y]]['up']:dic[pix[x, y]]['up'] = yif y < dic[pix[x, y]]['down']:dic[pix[x, y]]['down'] = yelse:dic[pix[x, y]] = {'count': 1, 'left': x, 'right': x, 'up': y, 'down': y}

运行出来就类似于这种


比如,第一个86,这个颜色的像素范围在x轴上为0到9,y轴范围为1到35,而我们图片的范围为x轴91个像素,y轴36个像素

目测一下验证码左右像素为20到85,上下像素为0到12,那么第一个肯定不满足

    for i in dic.keys():if 20 < abs(dic[i]['right'] - dic[i]['left']) < 85 and 1< abs(dic[i]['up'] - dic[i]['down']) < 12:l.append(i)print(dic[i])

我们把满足值的颜色提取出来,然后像素数量最多的多半就是验证码的颜色了

    for i in l:# print(str(i) + '\t' + str(dic[i]))if dic[i]['count'] > tmp:tmp = i

遍历所有像素,不是验证码颜色的直接改成白色

def clean(im, xx, yy, icode):pix = im.load()for x in range(xx):for y in range(yy):if pix[x, y] != icode:im.putpixel((x, y), 255)return im

最后去噪效果如下:

再用pytesseract.image_to_string识别一下即可

    test = image_to_string(im)print(test)

成功识别!

【python】image库使用以及验证码识别相关推荐

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

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

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

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

  3. python爬虫-古诗文网验证码识别

    文章目录 一.前期准备 二.示例代码 一.前期准备 古诗文网验证码识别,是通过对古诗文网登陆界面的验证码图片进行识别的,利用专门的验证码识别网站,可以提取验证码图片中的验证码 网站推荐:超级鹰 注册登 ...

  4. python:pytesseract库实现图片文字识别

    import pytesseract from PIL import Imagetext = pytesseract.image_to_string(Image.open(r"E:\repo ...

  5. python免费的验证码识别OCR库

    python免费的验证码识别OCR库 免费的验证码识别OCR项目已经打包成pypi包 1, 可以通过以下命令安装 pip install ddddocr -i https://pypi.org/sim ...

  6. 毕业设计 - 题目:基于python的验证码识别 - 机器视觉 验证码识别

    文章目录 0 前言 1 项目简介 2 验证码识别步骤 2.1 灰度处理&二值化 2.2 去除边框 2.3 图像降噪 2.4 字符切割 2.5 识别 3 基于tensorflow的验证码识别 3 ...

  7. curlopt_ssl_verifypeer后https还是验证不过_验证码识别竞赛解决方案(97%+一等奖)

    前言:这个库是为验证码识别竞赛而开发的一个基于pytorch实现的端到端的验证码识别系统.前后开发大概有2个月,其中大部分时间都在调参,后期参考kaggle大神经验,加入了一些trick,但是由于第一 ...

  8. Python验证码识别初探(tesserocr库)

    转载自:https://juejin.im/post/5b1b3cd26fb9a01e700ffe5b 前言 写爬虫有一个绕不过去的问题,那就是验证码,比如像某乎,如果不先登陆,连里面的内容数据都爬不 ...

  9. python验证码识别库_Python验证码识别

    注意:若使用云服务器 (Windows Server版) 遇到闪退,请按照步骤:我的电脑--属性--管理--添加角色和功能--勾选桌面体验,点击安装,安装之后重启即可. 2020/06/01编外: 想 ...

最新文章

  1. 验证请求的时间有效性和接口数据防盗链
  2. Linux系统诊断-内存基础
  3. django 路由分发 url分层
  4. jdk1.5-1.7新特性详细介绍
  5. 【Kafka】kafka检查消费者位置
  6. java安装的时候无效参数,spring-boot 打成jar把后 启动时指定参数无效
  7. 如何用git将本地文件放到github上
  8. Java入门系列-24-实现网络通信
  9. .hpp文件_16、OpenCV读写XML和YML文件
  10. 微信小程序入门级教程一
  11. MeGui原滤镜使用心得
  12. 文件名字超出计算机无法删除,电脑文件名太长无法删除怎么办
  13. rcond--矩阵可逆的条件数估值
  14. PowerDesigner 15下载(破解)
  15. shell脚本循环执行任务的脚本
  16. mongodb数据库学习日记(一)
  17. ESP32-S2 st7789 SPI TFT彩屏240X320
  18. mysql修改密码方法大全
  19. CTA策略及常用代码
  20. 通用型RS485通讯电池监测模块的功能及应用方案

热门文章

  1. 微商该怎么去实体店铺货,成功率会更大呢?
  2. 中国云计算的云栖“坐标”
  3. 【ARMv8 编程】寄存器
  4. Echarts普通横纵坐标柱形图
  5. 【动态ppt制作软件】Focusky教程 | 设置预加载信息
  6. 非人工智能专业怎样从零开始学人工智能?
  7. npm 设置淘宝镜像、nrm、nodemon
  8. java实现用户协同过滤算法
  9. QT软件开发-基于FFMPEG设计视频播放器-GPU硬解、OpenGL渲染(四)
  10. php 讯飞语音评测_人工AI语音新高度:讯飞翻译机3.0测评体验