如何使用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 相关文章推荐
Python3处理文件中每个词的方法
May 22 Python
Python计算三维矢量幅度的方法
Jun 15 Python
django站点管理详解
Dec 12 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
Python处理时间日期坐标轴过程详解
Jun 25 Python
opencv实现简单人脸识别
Feb 19 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
如何关掉pycharm中的python console(图解)
Oct 31 Python
Python学习之路安装pycharm的教程详解
Jun 17 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
基于Python实现天天酷跑功能
Jan 06 Python
看看如何用Python绘制小米新版天价logo
Apr 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
YII框架模块化处理操作示例
2019/04/26 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
2013/07/04 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
2019/06/05 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
Python json格式化打印实现过程解析
2020/07/21 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
历史系自荐信范文
2013/12/24 职场文书
求职信模板怎么做
2014/01/26 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
学生检讨书范文
2019/06/24 职场文书
创业计划书之便利店
2019/09/05 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android