如何使用python-opencv批量生成带噪点噪线的数字验证码


Posted in Python onDecember 21, 2020

第一次使用csdn写一个文章,如果有什么写的不对的地方,欢迎在下面评论指正,谢谢各位。

1.明确要使用的包

首先就是opencv的函数库,还有python自带的random和PIL(Image、ImageDraw、ImageFont),一般pthon3以上的版本都是内置安装的,如果没有安装可以通过pip install的方法安装具体操作如图:

如何使用python-opencv批量生成带噪点噪线的数字验证码

输入完按回车键即可安装,因为我已经安装了,就不输入回车键了,安装完了之后可以通过import的方式检验是否安装成功。记住先输入python进入python的编程环境在输入import PIL,否则就会报错

如何使用python-opencv批量生成带噪点噪线的数字验证码

2.引入库

代码如下(示例):

import cv2 as cv
import random
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

3.生成随机的颜色组合get_random_color()

彩色图像是由RGB三色通道构成的,但是要注意在opencv里面的彩色图像是按照BGR的顺序来构成彩色图像的,与其他的地方采用图像的顺序不一样(例如halcon就是安装RGB的顺序来引用彩色图像),
采用函数的形式来形成一个三个数组,当函数返回的数值超过三个的时候,就会以数组的形式返回。
代码如下(示例):

# 随机生成不同颜色的组合
def get_random_color():
  B = random.randint(0, 255)
  G = random.randint(0, 255)
  R = random.randint(0, 255)
  # 防止生成白色噪声噪线
  # 使用三个if条件判断防止三个通道的颜色都是255(虽然是不可能事件)
  if B == 255:
    B = 0
  elif G == 255:
    G = 0
  elif R == 255:
    R = 0
  return(B, G, R)

如果你不放心是否返回了一个数组,可以进行验证

#用于测试是否获得了数组
a = get_random_color()
print(a)

4.生成颜色随机,数值随机的数字生成函数get_random_number()

这个函数比较简单,原理也是和上面随机生成颜色组合一样。
代码如下(示例):

# 随机生成数字
def get_random_number():
  random_num = str(random.randint(0, 9))
  return random_num

5.随机生成一张干净的(不带噪声噪线)数字验证码图像

使用PIL的Image、ImageDraw、ImageFont分别用于生成白色图像背景、定义画笔用于往图像写入数字、定义文字的字形和字体大小。
代码如下(示例):

def generate_image():
  # 生成白色图像,'RGB'类型,宽高为(150,50),底色为白色(255,255,255)
  image = Image.new('RGB', (150, 50), (255,255,255))
  # 定义画笔,将图像与画笔关联
  draw = ImageDraw.Draw(image)
  # 定义文字字形以及字体大小
  font = ImageFont.truetype("arial.ttf", size=36)

  name = "" # 定义一个空的字符串,用于不断叠加数字,给图像命名
  for i in range(5):
    random_number = get_random_number()
    # 不断叠加随机生成的数字,用于给图像命名
    name += random_number

    # 在图片上写上数字,参数是:定位、数字(字符串)、颜色、字型
    draw.text((10+i*30, 0), random_number, get_random_color(), font=font)
  # 将图像保存到指定的文件夹,下面使用xxxx的形式代表文件夹
  image.save('G:\xxxxxx\xxxxxxxx\%s.png' % name)

字体可以根据自己电脑已有的字体来选择,具体路径是C:\Windows\Fonts,

font = ImageFont.truetype("arial.ttf", size=36)

6.往图像添加噪声噪线

函数的这一步不使用新的函数,继续接着上一个函数( generate_image())输入代码,为什么不使用?因为在读取图像的时候我们会用到name这个函数,如果使用新的函数的话,就无法使用这个变量。当然也可以通过类的方法,实现两个函数之间的变量可以相互调用,这个就稍微麻烦点,这里就不过多讲述了。
代码如下(示例):
(再次提醒下面代码是接着generate_image()的,所以下面代码都有一个缩进)

width = 150
  height = 50
  # 读取文件夹的图像,通过name来读取指定的图像,
  img = cv.imread('G:\xxxxxx\xxxxxxxxxxxx\%s.png' %name)
  # 绘制噪点
  for i in range(5):
    x = random.randint(0, width)
    y = random.randint(0, height)
    # 绘制实心圆,必须输入参数分别是:图像、圆心的位置、半径、颜色,
    #最后一个是thickness默认是None,绘制空心圆,指定为-1绘制实心圆
    cv.circle(img, (x,y), 1, get_random_color(), -1)

  # 绘制噪线
  for i in range(3):
    x1 = random.randint(0, width)
    y1 = random.randint(0, height)
    x2 = random.randint(0, width)
    y2 = random.randint(0, height)
    # 绘制线条,参数分别是:图像、左上角的坐标、右下角的坐标、颜色
    cv.line(img, (x1,y1), (x2,y2), get_random_color())
  # 保存图像
  cv.imwrite(r'G:\xxxxx\xxxxxxx\%s.png'%name, img)

7.调用函数生成数字验证码图像

所有的函数都已经写完,直接调用图像生成函数就行了。
使用for循环,循环调用generate_image()即可实现批量生成图像,想要多少张就循环多少次。

for i in range(30):
  generate_image()

8.总结

到这一步所有的工作已经完成了,可以去保存的指定文件夹看一下,是否成功生成,一般程序没有报错基本都是可以生成的。

第一次使用csdn写文章,肯定会有很多纰漏和不足,有什么建议和意见都可以在下面评论提出,我会一一更正,谢谢各位

到此这篇关于如何使用python-opencv批量生成带噪点噪线的数字验证码的文章就介绍到这了,更多相关opencv批量生成噪点验证码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现根据指定端口探测服务器/模块部署的方法
Aug 25 Python
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
Python的Django框架中的表单处理示例
Jul 17 Python
在Django的视图中使用form对象的方法
Jul 18 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
Sep 06 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
python数据分析:关键字提取方式
Feb 24 Python
pytorch之Resize()函数具体使用详解
Feb 27 Python
解决Jupyter因卸载重装导致的问题修复
Apr 10 Python
Python内置函数locals和globals对比
Apr 28 Python
Python 实现简单的客户端认证
Jul 29 Python
接口自动化多层嵌套json数据处理代码实例
Nov 20 Python
python 录制系统声音的示例
Dec 21 #Python
用python发送微信消息
Dec 21 #Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 #Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
Dec 21 #Python
python switch 实现多分支选择功能
Dec 21 #Python
selenium自动化测试入门实战
Dec 21 #Python
django中ImageField的使用详解
Dec 21 #Python
You might like
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
PHP-MySQL教程归纳总结
2008/06/07 PHP
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
javascript操作符"!~"详解
2015/02/10 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
python进阶教程之动态类型详解
2014/08/30 Python
Python脚本实现网卡流量监控
2015/02/14 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
Footshop法国:购买运动鞋
2020/01/19 全球购物
出生公证书样本
2014/04/04 职场文书
小学生作文评语大全
2014/04/21 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
分享3个非常实用的 Python 模块
2022/03/03 Python
Python PIL按比例裁剪图片
2022/05/11 Python