使用python-opencv批量生成帶噪點噪線的數字驗證碼

使用python-opencv批量生成帶噪點噪線的數字驗證碼




第一次使用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寫文章,肯定會有很多紕漏和不足,有什麼建議和意見都可以在下面評論提出,我會一一更正,謝謝各位

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章