文章目录

  • 一、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. SAP S4HANA 介绍LTMC的文章链接
  2. 【OpenCV学习】XML的读写
  3. 可爱又好用!阿里云盘「小白羊版」
  4. 火车站购票系统c语言编程,用c语言编写火车购票系统怎么编写,在线等,急!!!...
  5. 如何将visual studio 2010编辑模式改为插入???
  6. Sql server profiler抓出的语句不可信
  7. IIS中“使用 XSL 样式表无法查看 XML 输入”问题的解决
  8. SpringCloud Ribbon(四)之全局配置与服务配置
  9. 在地图上 添加柱状_如何做出一份惊艳的PPT地图页?这2个字,你一定要知道!...
  10. 都2021年了,c/c++开发竟然还能继续吃香??
  11. 分屏总屏计算机电缆,分屏加总屏电缆DJYVP计算机电缆14x2x0.75
  12. python调用C语言ctypes详解
  13. dom块级元素的各种宽高
  14. C#反编译之:<PrivateImplementationDetails>.ComputeStringHash 错误
  15. linux sudo log
  16. Co掺杂Fe3O4@MnO2/PDMS-TEOS@Fe3O4 聚二甲基硅氧烷修饰正硅酸四乙酯@四氧化三铁
  17. 说说android端实现Airplay多屏互动(一)
  18. 学计算机能用到的礼物,考上大学送什么礼物好,盘点10款有趣的
  19. 【Visual C++】游戏开发五十 浅墨DirectX教程十八 雪花飞扬 实现唯美的粒子系统
  20. android 游戏导引(4. 简单纹理贴图)

热门文章

  1. dota2起源1和2引擎区别_DOTA2将更新起源2引擎 游戏画质将大幅度提升
  2. 对 NFT 艺术未来的5个预测
  3. 计算机简介(学习Python准备)
  4. Android ViewHolder工具
  5. C++的一些冷门知识
  6. 使用VBA解决EXCEL条件格式应用范围变化问题
  7. nodejs 操作 redis
  8. 众赢嘉丨立刷电签4G免押版如何开通扫码功能
  9. C语言编辑个人信息,C语言实现的个人信息管理系统
  10. 马老师也有KPI?! 阿里巴巴脱贫基金发布半年年报