一、基础学习

在Python中,有一个优秀的图像处理框架,就是PIL库,pip install pillow

示例1

from PIL import Image

# 读取当前图片
im = Image.open('test.png') # 用系统自带的图片查看器查看该图片
im.show() # 将图片进行逆时针旋转
im.rotate(90).show() # 将图片进行顺时针旋转
im.rotate(-90).show() # 保存图像为gif格式
im.save("save.gif", "GIF") # resize成128*128像素大小
out = im.resize((128, 128))
out.save("test2.png", "png") # 拷贝黏贴:设置要拷贝的地区的大小,里面含有四个元素,为左上右下
box = (100, 100, 200, 200)
region = im.crop(box) # 按照box的大小拷贝到region里面
region.save("corp.png", "png") # 获取图片基本信息
# format: 图片格式;size:图片大小(长*宽); mode: 色彩模式
print(im.format, im.size, im.mode) # 等比例缩放
size = (128, 128)
im.thumbnail(size, Image.ANTIALIAS)
im.save("new.png", "png") # 通道分离,将图片封装成三个或四个通道,分别为三个或四个图像对象
print(im.mode) # 查看图片是什么色彩模式
r, g, b, a = im.split() # 我这里是RBGA模式
# r, g, b = im.split() # 如果是RGB模式 # 能分离就能合并,将b,r两个通道进行翻转。
im = Image.merge("RGBA", (b, g, r, a)) # Image.merge("RGB", (b, g, r)) # 图像左右转换
im.transpose(Image.FLIP_LEFT_RIGHT).show() # 图像上下转换
im.transpose(Image.FLIP_TOP_BOTTOM).show() # 图像类型转换
im = im.convert("RGB")
im.show()
im = im.convert("L") # 灰度图
im.show()

二、生成验证码

生成图片验证码

import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter """图片模糊化处理
im = Image.open('test.png')
# BLUR:模糊 还有:CONTOUR DETAIL等等
im2 = im.filter(ImageFilter.BLUR)
im2.show()
""" # 返回随机的RGB数字
def random_color():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255) def get_code():
with open('1.png', 'wb') as f:
# 第一步:生成一张图片(画布)
# 创建一个随机颜色的图片对象
# 参数:颜色模式,图片大小,图片颜色
img_obj = Image.new('RGB', (250, 35), random_color()) # 第二步:在该图片对象上生成一个画笔对象
draw_obj = ImageDraw.Draw(img_obj) # 使用什么字体,字体大小,kumo.ttf是我本地下载好的字体文件(sc.chinaz.com)可下载
font_obj = ImageFont.truetype('static/font/kumo.ttf', 28) # 生成验证码
code = ''
for i in range(6):
num = str(random.randint(0, 9)) # 数字
lower = chr(random.randint(97, 122)) # 小写字母
upper = chr(random.randint(65, 90)) # 大写字母
c = random.choice([num, lower, upper]) # 随机选取一个
code += str(c) # 用画笔把验证码画到图片上
# 参数:xy:坐标,画在哪个位置;text:画的内容;fill:画什么颜色;font:字体格式
draw_obj.text((35 + i * 30, 0), c, fill=random_color(), font=font_obj)
# 保存图片并模糊化
image = img_obj.filter(ImageFilter.BLUR)
image.save(f) get_code()

加干扰线和干扰点

画完验证码后,可以添加一些干扰
就是在 draw_obj.text((35 + i*30, 0), c, fill=random_color(), font=font_obj)之后加 1. 加干扰线
width = 250 # 图片宽度(防止越界)
height = 35
for i in range(5):
x1 = random.randint(0, width)
x2 = random.randint(0, width)
y1 = random.randint(0, height)
y2 = random.randint(0, height)
draw_obj.line((x1, y1, x2, y2), fill=random_color()) 2. 加干扰点
for i in range(40):
draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
x = random.randint(0, width)
y = random.randint(0, height)
draw_obj.arc((x, y, x+4, y+4), 0, 90, fill=random_color())

三、验证码破解

1、预备知识

二值化

from PIL import Image

"""
灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,
范围一般从0到255,白色为255,黑色为0。所谓灰度值是指色彩的浓淡程度,
灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰度值的象素数。
""" # 方法一:使用load函数获取到图片像素,直接对像素进行修改
def convert_img(img, threshold):
# 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度
img = img.convert("L") # img.convert("1")也是可以直接二值化,但是阈值是固定的127
# 图片的像素二维数组,例如:pixels[0,0] 第一行第一个的像素值
pixels = img.load()
# 二值化:自定义灰度界限,大于这个值为白色,小于这个值为黑色
for x in range(img.width):
for y in range(img.height):
if pixels[x, y] > threshold:
pixels[x, y] = 255
else:
pixels[x, y] = 0
return img # 方法二:使用point函数
from PIL import Image img = Image.open("captcha.png")
# 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
Img = img.convert('L')
# 自定义灰度界限,大于这个值为白色,小于这个值为黑色
threshold = 140
table = [] for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1) # 图片二值化
photo = Img.point(table, '1')
photo.save("test2.jpg")

获取每个像素点的RGB(RGBA)值

我的理解是:像素值是由这个点的RGB(A)值结合得到的,因此注意了,上面的像素值,我们这里是RGB值

# 获取每个像素点的RGB(RGBA)值
from PIL import Image im = Image.open("captcha.png")
# getdata()函数的返回值是一个sequence对象,
# sequence对象的每一个值就是这个像素点对应的R、G、B(A)值
data = im.getdata()
data = list(data)
print(data) # [(135, 142, 169, 255), (104, 111, 139, 255), ....]

2、利用Tesseract识别图片验证码

Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文)。 Tesseract最初由HP公司开发,后来由Google维护。

因此,我们需要在自己的环境安装Tesseract,至于怎么安装,百度下吧。。。

然后再下载 python对应的Tesseract模块

pip install pytesseract
from PIL import Image
import pytesseract """
灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,
范围一般从0到255,白色为255,黑色为0。所谓灰度值是指色彩的浓淡程度,
灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰度值的象素数。
""" def convert_img(img, threshold):
"""图片二值化"""
# 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度
img = img.convert("L") # img.convert("1")也是可以直接二值化,但是阈值是固定的127
# 图片的像素二维数组,例如:pixels[0,0] 第一行第一个的像素值
pixels = img.load()
# 二值化:自定义灰度界限,大于这个值为白色,小于这个值为黑色
for x in range(img.width):
for y in range(img.height):
if pixels[x, y] > threshold:
pixels[x, y] = 255
else:
pixels[x, y] = 0
return img def denoise(img):
"""图片降噪"""
data = img.getdata()
w, h = img.size
count = 0
for x in range(1, h - 1):
for y in range(1, h - 1):
# 找出各个像素方向
mid_pixel = data[w * y + x]
if mid_pixel == 0:
top_pixel = data[w * (y - 1) + x]
left_pixel = data[w * y + (x - 1)]
down_pixel = data[w * (y + 1) + x]
right_pixel = data[w * y + (x + 1)] if top_pixel == 0:
count += 1
if left_pixel == 0:
count += 1
if down_pixel == 0:
count += 1
if right_pixel == 0:
count += 1
if count > 4:
img.putpixel((x, y), 0)
return img if __name__ == '__main__':
captcha = Image.open("captcha.png") res = convert_img(captcha, 140)
ret = denoise(res)
ret.show()
result = pytesseract.image_to_string(ret)
print(result)

3、Tesseract-OCR样本训练

待我研究研究。。。

python之pillow模块学习--验证码的生成和破解的更多相关文章

  1. python中confIgparser模块学习

    python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...

  2. 【Python】logging模块学习笔记

    因为做接口自动化测试遇到的一个代码逻辑上的问题,又不知道具体问题出在哪里,所以在模块化代码之前,先学习下python的日志模块logging. 入门1 入门2 日志级别大小关系为:CRITICAL & ...

  3. python(五)常用模块学习

    版权声明:本文为原创文章,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明. https://blog.csdn.net/fgf00/article/details/52357 ...

  4. Python之常用模块学习(一)

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...

  5. Python 使用Pillow模块生成验证码

    1.安装 pip3 install pillow 2.使用步骤 生成验证码和验证字符串 绘制图片,将验证码放入session中 将图片返回给页面 3.代码demo #!/usr/bin/env pyt ...

  6. Python之路-python(常用模块学习)

    模块介绍 time &datetime模块 random os sys shutil shelve xml处理 yaml处理 configparser hashlib re正则表达式 1.模块 ...

  7. Python之常用模块学习(二)

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  8. python安装pillow模块错误

    安装的一些简单步骤就不介绍了,可以去搜索一下,主要就记录下我在安装pillow这一模块遇到的问题 1:安装好pillow后,安装过程没有出错 2:但是在python的IDLE输入from PIL im ...

  9. Day11 - Python基础11 模块学习——optparse

    Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强大 ...

随机推荐

  1. Python Web Framework All In One

    Python Web Framework All In One Django and Flask are the top Python web frameworks so far. Django ht ...

  2. CSS transition & shorthand property order

    CSS transition & shorthand property order shorthand property https://developer.mozilla.org/en-US ...

  3. React useMemo

    React useMemo react hooks https://reactjs.org/docs/hooks-reference.html#usememo useCallback & us ...

  4. image to cur (cursor icons)

    image to cur (cursor icons) mouse-cursor-pointer https://onlineconvertfree.com/convert-format/jpg-to ...

  5. Flutter 设置input边框

    example 1 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp ext ...

  6. linux DRM 之 GEM 笔记

    原文链接:https://www.cnblogs.com/yaongtime/p/14418357.html 在GPU上的各类操作中涉及到多种.多个buffer的使用. 通常我们GPU是通过图像API ...

  7. C++算法代码——字符串p型编码

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1681 题目描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字 ...

  8. @media屏幕适应

    /** 屏幕特殊处理 我们用min-width时,小的放上面大的在下面,同理如果是用max-width那么就是大的在上面,小的在下面 **/ @media screen and (max-width: ...

  9. 解决QQ能正常上网但是网页无法打开的办法

    最近网页老师稀里糊涂的打不开,在这里附上参考的行之有效的办法. https://baijiahao.baidu.com/s?id=1645363213803553998&wfr=spider& ...

  10. Android Layout属性

    通用属性 android:layout_height android:layout_width 值 含义 fill_parent/match_parent 高度或者宽度对齐到父控件 wrap_cont ...