使用python-opencv批量生成帶噪點噪線的數字驗證碼
文章目錄
- 1.明確要使用的包
- 2.引入庫
- 3.生成隨機的顏色組合get_random_color()
- 4.生成顏色隨機,數值隨機的數字生成函式get_random_number()
- 5.隨機生成一張干凈的(不帶噪聲噪線)數字驗證碼影像
- 6.往影像添加噪聲噪線
- 7.呼叫函式生成數字驗證碼影像
- 8.總結
第一次使用csdn寫一個文章,如果有什么寫的不對的地方,歡迎在下面評論指正,謝謝各位,
1.明確要使用的包
首先就是opencv的函式庫,還有python自帶的random和PIL(Image、ImageDraw、ImageFont),一般pthon3以上的版本都是內置安裝的,如果沒有安裝可以通過pip install的方法安裝具體操作如圖:

輸入完按回車鍵即可安裝,因為我已經安裝了,就不輸入回車鍵了,安裝完了之后可以通過import的方式檢驗是否安裝成功,記住先輸入python進入python的編程環境在輸入import PIL,否則就會報錯
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寫文章,肯定會有很多紕漏和不足,有什么建議和意見都可以在下面評論提出,我會一一更正,謝謝各位
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/238072.html
標籤:python
