一、基础学习

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

示例1

  1. from PIL import Image
  2.  
  3. # 读取当前图片
  4. im = Image.open('test.png')
  5.  
  6. # 用系统自带的图片查看器查看该图片
  7. im.show()
  8.  
  9. # 将图片进行逆时针旋转
  10. im.rotate(90).show()
  11.  
  12. # 将图片进行顺时针旋转
  13. im.rotate(-90).show()
  14.  
  15. # 保存图像为gif格式
  16. im.save("save.gif", "GIF")
  17.  
  18. # resize成128*128像素大小
  19. out = im.resize((128, 128))
  20. out.save("test2.png", "png")
  21.  
  22. # 拷贝黏贴:设置要拷贝的地区的大小,里面含有四个元素,为左上右下
  23. box = (100, 100, 200, 200)
  24. region = im.crop(box) # 按照box的大小拷贝到region里面
  25. region.save("corp.png", "png")
  26.  
  27. # 获取图片基本信息
  28. # format: 图片格式;size:图片大小(长*宽); mode: 色彩模式
  29. print(im.format, im.size, im.mode)
  30.  
  31. # 等比例缩放
  32. size = (128, 128)
  33. im.thumbnail(size, Image.ANTIALIAS)
  34. im.save("new.png", "png")
  35.  
  36. # 通道分离,将图片封装成三个或四个通道,分别为三个或四个图像对象
  37. print(im.mode) # 查看图片是什么色彩模式
  38. r, g, b, a = im.split() # 我这里是RBGA模式
  39. # r, g, b = im.split() # 如果是RGB模式
  40.  
  41. # 能分离就能合并,将b,r两个通道进行翻转。
  42. im = Image.merge("RGBA", (b, g, r, a)) # Image.merge("RGB", (b, g, r))
  43.  
  44. # 图像左右转换
  45. im.transpose(Image.FLIP_LEFT_RIGHT).show()
  46.  
  47. # 图像上下转换
  48. im.transpose(Image.FLIP_TOP_BOTTOM).show()
  49.  
  50. # 图像类型转换
  51. im = im.convert("RGB")
  52. im.show()
  53. im = im.convert("L") # 灰度图
  54. im.show()

二、生成验证码

生成图片验证码

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

加干扰线和干扰点

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

三、验证码破解

1、预备知识

二值化

  1. from PIL import Image
  2.  
  3. """
  4. 灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,
  5. 范围一般从0到255,白色为255,黑色为0。所谓灰度值是指色彩的浓淡程度,
  6. 灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰度值的象素数。
  7. """
  8.  
  9. # 方法一:使用load函数获取到图片像素,直接对像素进行修改
  10. def convert_img(img, threshold):
  11. # 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度
  12. img = img.convert("L") # img.convert("1")也是可以直接二值化,但是阈值是固定的127
  13. # 图片的像素二维数组,例如:pixels[0,0] 第一行第一个的像素值
  14. pixels = img.load()
  15. # 二值化:自定义灰度界限,大于这个值为白色,小于这个值为黑色
  16. for x in range(img.width):
  17. for y in range(img.height):
  18. if pixels[x, y] > threshold:
  19. pixels[x, y] = 255
  20. else:
  21. pixels[x, y] = 0
  22. return img
  23.  
  24. # 方法二:使用point函数
  25. from PIL import Image
  26.  
  27. img = Image.open("captcha.png")
  28. # 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
  29. Img = img.convert('L')
  30. # 自定义灰度界限,大于这个值为白色,小于这个值为黑色
  31. threshold = 140
  32. table = []
  33.  
  34. for i in range(256):
  35. if i < threshold:
  36. table.append(0)
  37. else:
  38. table.append(1)
  39.  
  40. # 图片二值化
  41. photo = Img.point(table, '1')
  42. photo.save("test2.jpg")

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

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

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

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

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

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

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

  1. pip install pytesseract
  1. from PIL import Image
  2. import pytesseract
  3.  
  4. """
  5. 灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,
  6. 范围一般从0到255,白色为255,黑色为0。所谓灰度值是指色彩的浓淡程度,
  7. 灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰度值的象素数。
  8. """
  9.  
  10. def convert_img(img, threshold):
  11. """图片二值化"""
  12. # 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度
  13. img = img.convert("L") # img.convert("1")也是可以直接二值化,但是阈值是固定的127
  14. # 图片的像素二维数组,例如:pixels[0,0] 第一行第一个的像素值
  15. pixels = img.load()
  16. # 二值化:自定义灰度界限,大于这个值为白色,小于这个值为黑色
  17. for x in range(img.width):
  18. for y in range(img.height):
  19. if pixels[x, y] > threshold:
  20. pixels[x, y] = 255
  21. else:
  22. pixels[x, y] = 0
  23. return img
  24.  
  25. def denoise(img):
  26. """图片降噪"""
  27. data = img.getdata()
  28. w, h = img.size
  29. count = 0
  30. for x in range(1, h - 1):
  31. for y in range(1, h - 1):
  32. # 找出各个像素方向
  33. mid_pixel = data[w * y + x]
  34. if mid_pixel == 0:
  35. top_pixel = data[w * (y - 1) + x]
  36. left_pixel = data[w * y + (x - 1)]
  37. down_pixel = data[w * (y + 1) + x]
  38. right_pixel = data[w * y + (x + 1)]
  39.  
  40. if top_pixel == 0:
  41. count += 1
  42. if left_pixel == 0:
  43. count += 1
  44. if down_pixel == 0:
  45. count += 1
  46. if right_pixel == 0:
  47. count += 1
  48. if count > 4:
  49. img.putpixel((x, y), 0)
  50. return img
  51.  
  52. if __name__ == '__main__':
  53. captcha = Image.open("captcha.png")
  54.  
  55. res = convert_img(captcha, 140)
  56. ret = denoise(res)
  57. ret.show()
  58. result = pytesseract.image_to_string(ret)
  59. 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. leetcode17 电话号码的字母组合 dfs

    就dfs吧.... 然后,我傻了.前一道题不用考虑空,这道题就要考虑.... 还有注意vector要引用传递 class Solution { public: void dfs(string temp ...

  2. QXDM和QCAT软件使用指南

    一.传送门 链接:https://pan.baidu.com/s/1i55YXnf 密码:v6nw 二.QXDM,QPST和QCAT的简单说明 QXDM,QPST和QCAT是Qualcomm高通公司针 ...

  3. NoSQL 数据库案例实战 -- MongoDB数据备份、恢复

    MySQL数据迁移到MongoDB数据库中 前言 一.数据备份 二.数据恢复 前言 本环境是基于 Centos 7.8 系统构建mongodb-enterprise-4.2.8学习环境具体构建,请参考 ...

  4. C++模板沉思录

    0 论抽象--前言 故事要从一个看起来非常简单的功能开始: 请计算两个数的和. 如果你对Python很熟悉,你一定会觉得:"哇!这太简单了!",然后写出以下代码: def Plus ...

  5. vue 单文件组件最佳实践

    vue 单文件组件最佳实践 生命周期 template <template> <section> <h1>vue single file components te ...

  6. git config [section] solutions

    git config [section] solutions fix git [section] warnings global config $ vim ~/.gitconfig [user] em ...

  7. ES6 ...rest In Action

    ES6 ...rest In Action const arr = [ 2.48, 13.77, 8.64, 20.17, 8.94, 8.07, 12.05, 5.71, 17.54, 2.63 ] ...

  8. CSS3 Animation & linear-gradient & css3 var & @keyframes

    CSS3 Animation & linear-gradient & css3 var & @keyframes https://www.zhangxinxu.com/word ...

  9. PAUL ADAMS ARCHITECT:爱丁堡的房屋价值创历史新高

    近日,英国知名房产公司保罗·亚当斯公司根据一组调查报告表示,今年第三季度,爱丁堡的房价再创历史新高,并向大家分析了原因. 保罗·亚当斯公司(公司编号:07635831)是英国一家著名的房地产公司,总部 ...

  10. React 函数式组件的 Ref 和子组件访问(useImperativeHandle)

    引入:如何调用函数式组件内部的方法 对于 React 中需要强制修改子组件的情况,React 提供了 Refs 这种解决办法,使得我们可以操作底层 DOM 元素或者自定的 class 组件实例.除此之 ...