如何使用python-opencv批量生成帶噪點(diǎn)噪線的數(shù)字驗(yàn)證碼
第一次使用csdn寫一個(gè)文章,如果有什么寫的不對(duì)的地方,歡迎在下面評(píng)論指正,謝謝各位。
1.明確要使用的包
首先就是opencv的函數(shù)庫,還有python自帶的random和PIL(Image、ImageDraw、ImageFont),一般pthon3以上的版本都是內(nèi)置安裝的,如果沒有安裝可以通過pip install的方法安裝具體操作如圖:

輸入完按回車鍵即可安裝,因?yàn)槲乙呀?jīng)安裝了,就不輸入回車鍵了,安裝完了之后可以通過import的方式檢驗(yàn)是否安裝成功。記住先輸入python進(jìn)入python的編程環(huán)境在輸入import PIL,否則就會(huì)報(bào)錯(cuò)

2.引入庫
代碼如下(示例):
import cv2 as cv import random from PIL import Image from PIL import ImageDraw from PIL import ImageFont
3.生成隨機(jī)的顏色組合get_random_color()
彩色圖像是由RGB三色通道構(gòu)成的,但是要注意在opencv里面的彩色圖像是按照BGR的順序來構(gòu)成彩色圖像的,與其他的地方采用圖像的順序不一樣(例如halcon就是安裝RGB的順序來引用彩色圖像),
采用函數(shù)的形式來形成一個(gè)三個(gè)數(shù)組,當(dāng)函數(shù)返回的數(shù)值超過三個(gè)的時(shí)候,就會(huì)以數(shù)組的形式返回。
代碼如下(示例):
# 隨機(jī)生成不同顏色的組合
def get_random_color():
B = random.randint(0, 255)
G = random.randint(0, 255)
R = random.randint(0, 255)
# 防止生成白色噪聲噪線
# 使用三個(gè)if條件判斷防止三個(gè)通道的顏色都是255(雖然是不可能事件)
if B == 255:
B = 0
elif G == 255:
G = 0
elif R == 255:
R = 0
return(B, G, R)
如果你不放心是否返回了一個(gè)數(shù)組,可以進(jìn)行驗(yàn)證
#用于測(cè)試是否獲得了數(shù)組 a = get_random_color() print(a)
4.生成顏色隨機(jī),數(shù)值隨機(jī)的數(shù)字生成函數(shù)get_random_number()
這個(gè)函數(shù)比較簡(jiǎn)單,原理也是和上面隨機(jī)生成顏色組合一樣。
代碼如下(示例):
# 隨機(jī)生成數(shù)字 def get_random_number(): random_num = str(random.randint(0, 9)) return random_num
5.隨機(jī)生成一張干凈的(不帶噪聲噪線)數(shù)字驗(yàn)證碼圖像
使用PIL的Image、ImageDraw、ImageFont分別用于生成白色圖像背景、定義畫筆用于往圖像寫入數(shù)字、定義文字的字形和字體大小。
代碼如下(示例):
def generate_image():
# 生成白色圖像,'RGB'類型,寬高為(150,50),底色為白色(255,255,255)
image = Image.new('RGB', (150, 50), (255,255,255))
# 定義畫筆,將圖像與畫筆關(guān)聯(lián)
draw = ImageDraw.Draw(image)
# 定義文字字形以及字體大小
font = ImageFont.truetype("arial.ttf", size=36)
name = "" # 定義一個(gè)空的字符串,用于不斷疊加數(shù)字,給圖像命名
for i in range(5):
random_number = get_random_number()
# 不斷疊加隨機(jī)生成的數(shù)字,用于給圖像命名
name += random_number
# 在圖片上寫上數(shù)字,參數(shù)是:定位、數(shù)字(字符串)、顏色、字型
draw.text((10+i*30, 0), random_number, get_random_color(), font=font)
# 將圖像保存到指定的文件夾,下面使用xxxx的形式代表文件夾
image.save('G:\xxxxxx\xxxxxxxx\%s.png' % name)
字體可以根據(jù)自己電腦已有的字體來選擇,具體路徑是C:\Windows\Fonts,
font = ImageFont.truetype("arial.ttf", size=36)
6.往圖像添加噪聲噪線
函數(shù)的這一步不使用新的函數(shù),繼續(xù)接著上一個(gè)函數(shù)( generate_image())輸入代碼,為什么不使用?因?yàn)樵谧x取圖像的時(shí)候我們會(huì)用到name這個(gè)函數(shù),如果使用新的函數(shù)的話,就無法使用這個(gè)變量。當(dāng)然也可以通過類的方法,實(shí)現(xiàn)兩個(gè)函數(shù)之間的變量可以相互調(diào)用,這個(gè)就稍微麻煩點(diǎn),這里就不過多講述了。
代碼如下(示例):
(再次提醒下面代碼是接著generate_image()的,所以下面代碼都有一個(gè)縮進(jìn))
width = 150
height = 50
# 讀取文件夾的圖像,通過name來讀取指定的圖像,
img = cv.imread('G:\xxxxxx\xxxxxxxxxxxx\%s.png' %name)
# 繪制噪點(diǎn)
for i in range(5):
x = random.randint(0, width)
y = random.randint(0, height)
# 繪制實(shí)心圓,必須輸入?yún)?shù)分別是:圖像、圓心的位置、半徑、顏色,
#最后一個(gè)是thickness默認(rèn)是None,繪制空心圓,指定為-1繪制實(shí)心圓
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)
# 繪制線條,參數(shù)分別是:圖像、左上角的坐標(biāo)、右下角的坐標(biāo)、顏色
cv.line(img, (x1,y1), (x2,y2), get_random_color())
# 保存圖像
cv.imwrite(r'G:\xxxxx\xxxxxxx\%s.png'%name, img)
7.調(diào)用函數(shù)生成數(shù)字驗(yàn)證碼圖像
所有的函數(shù)都已經(jīng)寫完,直接調(diào)用圖像生成函數(shù)就行了。
使用for循環(huán),循環(huán)調(diào)用generate_image()即可實(shí)現(xiàn)批量生成圖像,想要多少張就循環(huán)多少次。
for i in range(30): generate_image()
8.總結(jié)
到這一步所有的工作已經(jīng)完成了,可以去保存的指定文件夾看一下,是否成功生成,一般程序沒有報(bào)錯(cuò)基本都是可以生成的。
第一次使用csdn寫文章,肯定會(huì)有很多紕漏和不足,有什么建議和意見都可以在下面評(píng)論提出,我會(huì)一一更正,謝謝各位
到此這篇關(guān)于如何使用python-opencv批量生成帶噪點(diǎn)噪線的數(shù)字驗(yàn)證碼的文章就介紹到這了,更多相關(guān)opencv批量生成噪點(diǎn)驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你深入理解Flask中的Session和Cookies
Flask,作為一個(gè)靈活的微型 web 框架,提供了會(huì)話(Session)和 Cookies 管理的能力,本文將深入探討 Flask 中的會(huì)話和 Cookies 的概念、工作機(jī)制以及應(yīng)用實(shí)例,希望對(duì)大家有所幫助2023-12-12
淺析python 定時(shí)拆分備份 nginx 日志的方法
本文給大家分享python 定時(shí)拆分備份 nginx 日志的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-04-04
詳細(xì)過程帶你用Python做車牌自動(dòng)識(shí)別系統(tǒng)
這篇文章主要介紹了帶你用Python做車牌自動(dòng)識(shí)別系統(tǒng)的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
PyCharm實(shí)現(xiàn)本地恢復(fù)或查看歷史代碼
這篇文章主要介紹了PyCharm實(shí)現(xiàn)本地恢復(fù)或查看歷史代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
python實(shí)現(xiàn)名片管理系統(tǒng)項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)名片管理系統(tǒng)項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
詳解如何在cmd命令窗口中搭建簡(jiǎn)單的python開發(fā)環(huán)境
這篇文章主要介紹了詳解如何在cmd命令窗口中搭建簡(jiǎn)單的python開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Python編寫的com組件發(fā)生R6034錯(cuò)誤的原因與解決辦法
pythoncom27.dll可能沒有包含manifest信息,或者沒有包含正確的manifest信息,或者系統(tǒng)中的c++ runtime library受到破壞都有可能造成這種現(xiàn)象2013-04-04

