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

關(guān)于多種驗(yàn)證碼的應(yīng)對(duì)方式

爬蟲(chóng)程序會(huì)遇到各色各樣的驗(yàn)證碼,整理一下解決方法。

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括房縣網(wǎng)站建設(shè)、房縣網(wǎng)站制作、房縣網(wǎng)頁(yè)制作以及房縣網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,房縣網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到房縣省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!

1.使用均值哈希算法進(jìn)行圖像識(shí)別

原理是根據(jù)像素平均值對(duì)比,來(lái)得到一串0這樣的字符串,通過(guò)比較相同位置上是否相同。

統(tǒng)計(jì)出來(lái)的數(shù)量作為相似度憑據(jù)。

適用于不規(guī)則,難以識(shí)別文字或字母時(shí)的圖像對(duì)比,適用面不廣,但思路可以借鑒。

代碼如下:

#開(kāi)發(fā)時(shí)間: 2022/11/2 20:42
import cv2
from PIL import Image
import numpy as np

#改這里?。?!
path = r"E:\pic\123\8.jpg"#要識(shí)別的主圖像
path8 = r"E:\pic\123"#這里存放那0-7編號(hào)的八張圖片所在文件夾地址,不需要加\,如E:\pic

#均值哈希算法
def aHash(img):
    image = cv2.imread(img)
    # 縮放為10*10
    img = cv2.resize(image, (10, 10))
    # 轉(zhuǎn)換為灰度圖
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # s為像素和初值為0,hash_str為hash值初值為''
    s = 0
    hash_str = ''
    # 遍歷累加求像素和
    for i in range(10):
        for j in range(10):
            s = s + gray[i, j]
    # 求平均灰度
    avg = s / 100
    # 灰度大于平均值為1相反為0生成圖片的hash值
    for i in range(10):
        for j in range(10):
            if gray[i, j] > avg:
                hash_str = hash_str + '1'
            else:
                hash_str = hash_str + '0'
    return hash_str

def cmpHash(hash1, hash2):
    n = 0
    # hash長(zhǎng)度不同則返回-1代表傳參出錯(cuò)
    if len(hash1)!=len(hash2):
        return -1
    # 遍歷判斷
    for i in range(len(hash1)):
        # 不相等則n計(jì)數(shù)+1,n最終為相似度
        if hash1[i] != hash2[i]:
            n = n + 1
    return n

def chanese2num(image1):
    hash1 = aHash(image1)
    n1 = 0
    for i in range(8):
        image2  = path8+ "/" +str(i) + ".jpg"
        blackwhite(image2, 0)
        hash2 = aHash(image2)
        n = 100 - cmpHash(hash1, hash2)
        # print(n,i)#調(diào)試用
        if n >= n1:
            n1 = n
            num = i
    return num

def blackwhite(input_img_file,flag):
    """
    轉(zhuǎn)化為二值圖像
    """
    img = Image.open(input_img_file)
    # 模式L”為灰色圖像,它的每個(gè)像素用8個(gè)bit表示,0表示黑,255表示白,其他數(shù)字表示不同的灰度。
    Img = img.convert('L')
    table = []
    if flag == 0:
        #處理藍(lán)底白字
        threshold = 180
        for i in range(256):
            if i < threshold:
                table.append(1)
            else:
                table.append(0)
        photo = Img.point(table, '1')
        photo.save(input_img_file)
    if flag == 1:
        #處理白底紅字
        threshold = 228
        for i in range(256):
            if i < threshold:
                table.append(0)
            else:
                table.append(1)
        photo = Img.point(table, '1')
        photo.save(r"E:\pic\123/test.jpg")

def main():
    image = cv2.imread(path)
    image = np.array(image)
    frame1 = image[2:32, 140:211]#裁剪圖像,必須在opencv的數(shù)組圖像格式下才成立
    save_file = r"E:\pic\123\test.jpg"
    # cv2.imshow('666', image)
    cv2.imencode('.jpg', frame1)[1].tofile(save_file)  # 防止出現(xiàn)亂碼
    blackwhite(save_file, 1)  # 處理需要識(shí)別的并覆蓋原圖像
    num = chanese2num(save_file)
    return num
    # cv2.waitKey(0)

if __name__ == '__main__':
    num = main()
    print(f"編號(hào)是{num}的圖片是相似度最高的")
    """
    在爬蟲(chóng)程序里這樣調(diào)用:
    my_crawler是你存放這個(gè)代碼的文件夾
    
    from my_crawler import yanzhengma2
    if __name__ == '__main__':
        num = yanzhengma2.main()
        print(num)
        
    #num就是你需要的編號(hào)
    """

2.使用pytesseract進(jìn)行識(shí)別

我用來(lái)識(shí)別過(guò)文字,但效果很差勁,對(duì)于文字間隔,像素質(zhì)量要求很?chē)?yán)格。

整體來(lái)說(shuō)效果不好

import pytesseract
import numpy as np
from PIL import Image

def threshold_By_OTSU(input_img_file):
    newimage = Image.open(input_img_file).convert('L')  # 打開(kāi)圖片時(shí)候用convert('L')方法轉(zhuǎn)換為灰點(diǎn)
    newimage.save(r"E:\pic\123/9.jpg")
    print(pytesseract.image_to_string(newimage, lang='chi_sim'))

file=r'E:\pic\123\8.jpg'
threshold_By_OTSU(file)

這里使用時(shí),遇到了opencv中讀取圖片,和PIL中Image讀取圖片的不同方式,之后再仔細(xì)研究一下使用規(guī)范

3.使用ddddocr進(jìn)行識(shí)別

帶帶弟弟是一個(gè)非常強(qiáng)大的驗(yàn)證碼識(shí)別工具,可以識(shí)別漢字,滑塊,點(diǎn)擊文字等許多種類(lèi)的驗(yàn)證碼

github源碼:https://github.com/sml2h3/ddddocr

pypi官方:https://pypi.org/project/ddddocr/

對(duì)于文字識(shí)別,代碼如下:

import os
import ddddocr
from PIL import Image
from io import BytesIO

ALLOW_FILE_TYPE = ['jpg', 'png']
ocr = ddddocr.DdddOcr(show_ad = False)

def ocr_detect(path):
    """
    OCR漢字識(shí)別
    """
    fp, code = None, None

    if not os.path.exists(path): return code
    _, file_type = path.rsplit(".",1)

    if file_type.lower() not in ALLOW_FILE_TYPE: return  code
    try:
        fp = open(path, 'rb')
        con1 = fp.read()
        img = Image.open(BytesIO(con1))
        code = ocr.classification(img)
    except Exception as exc:
        print('[ERROR] 識(shí)別發(fā)生錯(cuò)誤:', exc)
    finally:
        if fp: fp.close()
    return  code

if __name__ == '__main__':
    code = ocr_detect(r'E:\pic\123\test.jpg')
    for i in range(8):
        code2 = ocr_detect(f'E:\pic/123/{i}.jpg')
        if code == code2:
            print(f"編碼為{i}的是對(duì)的")
        else:
            print("寄了")

具體使用方式參考官方文檔即可

更多方法用到后會(huì)繼續(xù)更新~

當(dāng)前名稱(chēng):關(guān)于多種驗(yàn)證碼的應(yīng)對(duì)方式
文章網(wǎng)址:http://chinadenli.net/article8/dsogdip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、做網(wǎng)站、ChatGPT、移動(dòng)網(wǎng)站建設(shè)、小程序開(kāi)發(fā)網(wǎng)站營(yíng)銷(xiāo)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)