欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Serverless中火絨使用云函數(shù)SCF快速部署驗(yàn)證碼識(shí)別接口

今天就跟大家聊聊有關(guān)Serverless中火絨使用云函數(shù)SCF快速部署驗(yàn)證碼識(shí)別接口,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給創(chuàng)新互聯(lián)公司一個(gè)展示的機(jī)會(huì)來證明自己,這并不會(huì)花費(fèi)您太多時(shí)間,或許會(huì)給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗(yàn),一切以用戶為中心。

驗(yàn)證碼識(shí)別是搞爬蟲實(shí)現(xiàn)自動(dòng)化腳本避不開的一個(gè)問題。通常驗(yàn)證碼識(shí)別程序要么部署在本地,要么部署在服務(wù)器端。如果部署在服務(wù)器端就需要自己去搭建配置網(wǎng)絡(luò)環(huán)境并編寫調(diào)用接口,這是一個(gè)極其繁瑣耗時(shí)的過程。

但是現(xiàn)在我們通過騰訊云云函數(shù) SCF,就可以快速將本地的驗(yàn)證碼識(shí)別程序發(fā)布上線,極大地提高了開發(fā)效率。

效果展示

Serverless中火絨使用云函數(shù)SCF快速部署驗(yàn)證碼識(shí)別接口

Serverless中火絨使用云函數(shù)SCF快速部署驗(yàn)證碼識(shí)別接口

可以看到,識(shí)別效果還是蠻好的,甚至超過了肉眼識(shí)別率。

操作步驟

傳統(tǒng)的驗(yàn)證碼識(shí)別流程是

  1. 圖像預(yù)處理(灰化,去噪,切割,二值化,去干擾線等)

  2. 驗(yàn)證碼字符特征提?。⊿VM,CNN 等)

  3. 驗(yàn)證碼識(shí)別

下面我就帶大家一起來創(chuàng)建、編寫并發(fā)布上線一個(gè)驗(yàn)證識(shí)別云函數(shù)

第一步:新建 python 云函數(shù)

參見系列文章《萬物皆可Serverless之使用 SCF+COS 快速開發(fā)全棧應(yīng)用》

第二步:編寫驗(yàn)證識(shí)別云函數(shù)

Serverless中火絨使用云函數(shù)SCF快速部署驗(yàn)證碼識(shí)別接口

Life is short, show me the code.

這里我就以一個(gè)最簡(jiǎn)單的驗(yàn)證碼識(shí)別程序?yàn)槔?,直接上代碼

import io
import os
import time
from PIL import Image as image
import json

#字符特征
chars = {
    '1': [1, 1, 1, 0, 1, ...],
    '2': [1, 0, 0, 1, 0, ...],
    '3': [0, 1, 0, 0, 1, ...],
    # 其他字符特征...
}


# 灰度處理
def covergrey(img):
    return img.convert('L')

# 去除驗(yàn)證碼邊框
def clearedge(img):
    for y in range(img.size[1]):
        img.putpixel((0, y), 255)
        img.putpixel((1, y), 255)
        img.putpixel((2, y), 255)
        img.putpixel((img.size[0]-1, y), 255)
        img.putpixel((img.size[0]-2, y), 255)
        img.putpixel((img.size[0]-3, y), 255)
    for x in range(img.size[0]):
        img.putpixel((x, 0), 255)
        img.putpixel((x, 1), 255)
        img.putpixel((x, 2), 255)
        img.putpixel((x, img.size[1]-1), 255)
        img.putpixel((x, img.size[1]-2), 255)
        img.putpixel((x, img.size[1]-3), 255)
    return img

# 去除干擾線并轉(zhuǎn)換為黑白照片
def clearline(img):
    for y in range(img.size[1]):
        for x in range(img.size[0]):
            if int(img.getpixel((x, y))) >= 110:
                img.putpixel((x, y), 0xff)
            else:
                img.putpixel((x, y), 0x0)
    return img

# 去噪/pnum-去噪效率
def del_noise(im, pnum=3):
    w, h = im.size
    white = 255
    black = 0
    for i in range(0, w):
        im.putpixel((i, 0), white)
        im.putpixel((i, h - 1), white)
    for i in range(0, h):
        im.putpixel((0, i), white)
        im.putpixel((w - 1, i), white)
    for i in range(1, w - 1):
        for j in range(1, h - 1):
            val = im.getpixel((i, j))
            if val == black:
                cnt = 0
                for ii in range(-1, 2):
                    for jj in range(-1, 2):
                        if im.getpixel((i + ii, j + jj)) == black:
                            cnt += 1
                if cnt < pnum:
                    im.putpixel((i, j), white)
            else:
                cnt = 0
                for ii in range(-1, 2):
                    for jj in range(-1, 2):
                        if im.getpixel((i + ii, j + jj)) == black:
                            cnt += 1
                if cnt >= 7:
                    im.putpixel((i, j), black)
    return im

# 圖片數(shù)據(jù)二值化
def two_value(code_data):
    table = [serverless]
    for i in code_data:
        if i < 140:  # 二值化分界線140
            table.append(0)
        else:
            table.append(1)
    return table

# 圖片預(yù)處理
def pre_img(img):
    img = covergrey(img)  # 去色
    img = clearedge(img)  # 去邊
    img = clearline(img)  # 去線
    img = del_noise(img)  # 去噪
    return img

# 處理圖片數(shù)據(jù)
def data_img(img):
    code_data = [serverless]  # 驗(yàn)證碼數(shù)據(jù)列表
    for i in range(4):  # 切割驗(yàn)證碼
        x = 5 + i * 18  # 可用PS確定圖片切割位置
        code_data.append(img.crop((x, 9, x + 18, 33)).getdata())
        code_data[i] = two_value(code_data[i])  # 二值化數(shù)據(jù)
    return code_data

# 驗(yàn)證碼識(shí)別
def identify(data):
    code = ['']*4  # 驗(yàn)證碼字符列表
    diff_min = [432]*4  # 初始化最小距離--不符合的數(shù)據(jù)點(diǎn)個(gè)數(shù)(共120數(shù)據(jù)點(diǎn))
    for char in chars:  # 遍歷驗(yàn)證碼字符(每個(gè)字符比較一次4個(gè)驗(yàn)證碼)
        diff = [0]*4  # 各驗(yàn)證碼差距值(每個(gè)字符判斷前重置此距離)
        for i in range(4):  # 計(jì)算四個(gè)驗(yàn)證碼
            for j in range(432):  # 逐個(gè)像素比較驗(yàn)證碼特征
                if data[i][j] != chars[char][j]:
                    diff[i] += 1  # 距離+1
        for i in range(4):
            if diff[i] < diff_min[i]:  # 比已有距離還要小(更加符合)
                diff_min[i] = diff[i]  # 刷新最小距離
                code[i] = char  # 刷新最佳驗(yàn)證碼
    return ''.join(code)  # 輸出結(jié)果


def predict(imgs):
    code = ''
    img = imgs.read()
    img = image.open(io.BytesIO(img))
    img = pre_img(img)  # 預(yù)處理圖片
    data = data_img(img)  # 獲取圖片數(shù)據(jù)
    code = identify(data)  # 識(shí)別驗(yàn)證碼
    return code


def apiReply(reply, code=200):
    return {
        "isBase64Encoded": False,
        "statusCode": code,
        "headers": {'Content-Type': 'application/json', "Access-Control-Allow-Origin": "*"},
        "body": json.dumps(reply, ensure_ascii=False)
    }


def main_handler(event, context):
    main_start = time.time()
    flag = True if 'image' in event['queryString'] else False
    code = predict(event['queryString']['image']) if 'image' in event['queryString'] else '無效的請(qǐng)求'
    return apiReply({
        'ok': flag,
        'code': code,
        'spendTime': str(time.time()-main_start)
    })

老規(guī)矩,先捋一下整個(gè)云函數(shù)的流程。

def main_handler(event, context):
    main_start = time.time()
    flag = True if 'image' in event['queryString'] else False
    code = predict(event['queryString']['image']) if 'image' in event['queryString'] else '無效的請(qǐng)求'
    return apiReply({
        'ok': flag,
        'code': code,
        'spendTime': str(time.time()-main_start)
    })

首先,我們通過 event 事件拿到 api 請(qǐng)求的驗(yàn)證碼 image 數(shù)據(jù),然后判斷一下 image 參數(shù)是否存在,若不存在就返回請(qǐng)求無效的提示

def predict(imgs):
    code = ''
    img = imgs.read()
    img = image.open(io.BytesIO(img))
    img = pre_img(img)  # 預(yù)處理圖片
    data = data_img(img)  # 獲取圖片數(shù)據(jù)
    code = identify(data)  # 識(shí)別驗(yàn)證碼
    return code

如果 image 請(qǐng)求參數(shù)存在就調(diào)用 predict 函數(shù)解析識(shí)別驗(yàn)證碼,流程如下:

  1. 讀取驗(yàn)證碼圖像

  2. 驗(yàn)證碼圖像預(yù)處理

  3. 識(shí)別處理后的驗(yàn)證碼

# 圖片預(yù)處理
def pre_img(img):
    img = covergrey(img)  # 去色
    img = clearedge(img)  # 去邊
    img = clearline(img)  # 去線
    img = del_noise(img)  # 去噪
    return img

我們來看一下圖像預(yù)處理過程

  1. 將驗(yàn)證碼去色,轉(zhuǎn)為灰度圖

  2. 去除驗(yàn)證碼黑色邊框

  3. 去除驗(yàn)證碼干擾線

  4. 去除驗(yàn)證碼噪點(diǎn)

#字符特征
chars = {
    '1': [1, 1, 1, 0, 1, ...],
    '2': [1, 0, 0, 1, 0, ...],
    '3': [0, 1, 0, 0, 1, ...],
    # 其他字符特征...
}

# 驗(yàn)證碼識(shí)別
def identify(data):
    code = ['']*4  # 驗(yàn)證碼字符列表
    diff_min = [432]*4  # 初始化最小距離--不符合的數(shù)據(jù)點(diǎn)個(gè)數(shù)(共120數(shù)據(jù)點(diǎn))
    for char in chars:  # 遍歷驗(yàn)證碼字符(每個(gè)字符比較一次4個(gè)驗(yàn)證碼)
        diff = [0]*4  # 各驗(yàn)證碼差距值(每個(gè)字符判斷前重置此距離)
        for i in range(4):  # 計(jì)算四個(gè)驗(yàn)證碼
            for j in range(432):  # 逐個(gè)像素比較驗(yàn)證碼特征
                if data[i][j] != chars[char][j]:
                    diff[i] += 1  # 距離+1
        for i in range(4):
            if diff[i] < diff_min[i]:  # 比已有距離還要?。ǜ臃希?
                diff_min[i] = diff[i]  # 刷新最小距離
                code[i] = char  # 刷新最佳驗(yàn)證碼
    return ''.join(code)  # 輸出結(jié)果

PS:文章中的字符特征 chars 并不完整,你可能需要自行提取所有特征。

最后來看一下驗(yàn)證碼的識(shí)別過程:這里我們直接簡(jiǎn)單粗暴地取處理后圖像數(shù)據(jù)的所有像素點(diǎn)作為字符的特征(所謂大道至簡(jiǎn)),然后將每個(gè)待識(shí)別字符處理后圖像的數(shù)據(jù)與所有字符的特征逐個(gè)比較,取最相似的那個(gè)字符作為識(shí)別結(jié)果。

Serverless中火絨使用云函數(shù)SCF快速部署驗(yàn)證碼識(shí)別接口

嗯,沒什么問題的話,你就可以得到正確的識(shí)別結(jié)果了。

看完上述內(nèi)容,你們對(duì)Serverless中火絨使用云函數(shù)SCF快速部署驗(yàn)證碼識(shí)別接口有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

文章標(biāo)題:Serverless中火絨使用云函數(shù)SCF快速部署驗(yàn)證碼識(shí)別接口
網(wǎng)頁路徑:http://chinadenli.net/article30/ppchso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、品牌網(wǎng)站建設(shè)、用戶體驗(yàn)、ChatGPT、網(wǎng)站維護(hù)、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
欧美一区二区三区在线播放| 91亚洲精品国产一区| 激情图日韩精品中文字幕| 欧美黑人巨大一区二区三区| 丰满人妻一二三区av| 日韩性生活视频免费在线观看 | 中文字幕乱码一区二区三区四区| 黑鬼糟蹋少妇资源在线观看| 一区二区日韩欧美精品| 日韩视频在线观看成人| 亚洲最新中文字幕一区| 欧美日韩国产的另类视频| 国产丝袜极品黑色高跟鞋| 日本办公室三级在线观看| 色哟哟在线免费一区二区三区| 99久久精品午夜一区二区| 日韩欧美国产精品自拍| 日本美国三级黄色aa| 激情图日韩精品中文字幕| 污污黄黄的成年亚洲毛片 | 91久久精品中文内射| 国产精品成人一区二区三区夜夜夜| 国产又爽又猛又粗又色对黄| 欧美亚洲三级视频在线观看| 亚洲一区二区三区三州| 日本一本在线免费福利| 国产精品第一香蕉视频| 色无极东京热男人的天堂| 空之色水之色在线播放| 麻豆剧果冻传媒一二三区| 99精品人妻少妇一区二区人人妻| 福利专区 久久精品午夜| 国产一区二区三区丝袜不卡| 国产欧美日产中文一区 | 成年人免费看国产视频| 国产三级视频不卡在线观看| 日韩精品一区二区一牛| 91麻豆精品欧美一区| 午夜久久精品福利视频| 色综合久久超碰色婷婷| 国产一区二区三区不卡|