最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+Selenium+Pytesseract實(shí)現(xiàn)圖片驗(yàn)證碼識(shí)別

 更新時(shí)間:2022年01月08日 13:31:54   作者:Python可樂(lè)呀  
這篇文章主要介紹了利用Python+Selenium+Pytesseract實(shí)現(xiàn)圖片驗(yàn)證碼識(shí)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、selenium截取驗(yàn)證碼

import json
from io import BytesIO

import time
from test.testBefore.testDriver import driver
from test.util.test_pytesseract import recognize
from PIL import Image
import allure
import unittest

 '''
 /處理驗(yàn)證碼
 '''
 # 要截圖的元素
 element = driver.find_element_by_xpath('//*[@id="imgVerifyCode"]')
 # 坐標(biāo)
 x, y = element.location.values()
 # 寬高
 h, w = element.size.values()
 # 把截圖以二進(jìn)制形式的數(shù)據(jù)返回
 image_data = driver.get_screenshot_as_png()
 # 以新圖片打開(kāi)返回的數(shù)據(jù)
 screenshot = Image.open(BytesIO(image_data))
 # 對(duì)截圖進(jìn)行裁剪
 result = screenshot.crop((x, y, x + w, y + h))
 # 顯示圖片
 # result.show()
 # 保存驗(yàn)證碼圖片
 result.save('VerifyCode.png')
 # 調(diào)用recognize方法識(shí)別驗(yàn)證碼
 code = recognize('VerifyCode.png')
 # 輸入驗(yàn)證碼
 driver.find_element_by_xpath('//*[@id="txtcode"]').send_keys(code)
 '''
 處理驗(yàn)證碼/
 '''

注意:driver是引用我自己寫(xiě)的文件,可以自己隨便寫(xiě)一個(gè)。識(shí)別圖片的代碼單獨(dú)放在util文件夾下面的,參考標(biāo)題三的代碼,需要時(shí)引用。以上代碼定位元素都需要根據(jù)自己的項(xiàng)目定位元素修改。

二、安裝識(shí)別環(huán)境pytesseract+Tesseract-OCR

如果沒(méi)有輸出,又不確定你的pytesseract環(huán)境是否安裝好,可以用一張沒(méi)有干擾的圖片識(shí)別看看能不能有輸出結(jié)果,以下樣例在我的環(huán)境中可以直接輸出識(shí)別結(jié)果8fnp

驗(yàn)證識(shí)別環(huán)境是否正常

直接使用pytesseract識(shí)別圖片

001.png

text = pytesseract.image_to_string('./001.png')
print(text)

三、處理驗(yàn)證碼圖片

直接截圖的驗(yàn)證碼圖片存在噪點(diǎn)或者干擾線等,直接使用pytesseract識(shí)別可能會(huì)沒(méi)有輸出結(jié)果,如果環(huán)境正常,但沒(méi)有輸出結(jié)果,那多半是因?yàn)閳D片沒(méi)有處理好,識(shí)別不出來(lái),可以多嘗試一些處理圖片的方式,以下代碼處理我截圖這種類(lèi)似的圖片效果比較好。

圖片處理識(shí)別

對(duì)圖片處理的過(guò)程:

圖片處理過(guò)程中可以多用im.show()看看每一步處理后的圖片是不是符合預(yù)期,如果效果不好調(diào)一下參數(shù)。另外在學(xué)習(xí)過(guò)程中發(fā)現(xiàn)有童鞋說(shuō)識(shí)別不出來(lái)把圖片使用cv2.resize()這個(gè)方法放大就能識(shí)別,可以參考Python中圖像的縮放 resize()函數(shù)的應(yīng)用

實(shí)際截取的圖片

處理后的圖片

test_pytesseract.py

import pytesseract
from fnmatch import fnmatch
import cv2
import os


def clear_border(img, img_name):
    '''
    去除邊框
    '''
    h, w = img.shape[:2]
    for y in range(0, w):
        for x in range(0, h):
            # if y ==0 or y == w -1 or y == w - 2:
            if y < 2 or y > w - 2:
                img[x, y] = 255
            # if x == 0 or x == h - 1 or x == h - 2:
            if x < 1 or x > h - 1:
                img[x, y] = 255

    return img


def interference_line(img, img_name):
    '''
    干擾線降噪
    '''

    h, w = img.shape[:2]
    # !?。pencv矩陣點(diǎn)是反的
    # img[1,2] 1:圖片的高度,2:圖片的寬度
    for r in range(0, 2):
        for y in range(1, w - 1):
            for x in range(1, h - 1):
                count = 0
                if img[x, y - 1] > 245:
                    count = count + 1
                if img[x, y + 1] > 245:
                    count = count + 1
                if img[x - 1, y] > 245:
                    count = count + 1
                if img[x + 1, y] > 245:
                    count = count + 1
                if count > 2:
                    img[x, y] = 255
    return img


def interference_point(img, img_name, x=0, y=0):
    """點(diǎn)降噪
    9鄰域框,以當(dāng)前點(diǎn)為中心的田字框,黑點(diǎn)個(gè)數(shù)
    :param x:
    :param y:
    :return:
    """
    # todo 判斷圖片的長(zhǎng)寬度下限
    cur_pixel = img[x, y]  # 當(dāng)前像素點(diǎn)的值
    height, width = img.shape[:2]

    for y in range(0, width - 1):
        for x in range(0, height - 1):
            if y == 0:  # 第一行
                if x == 0:  # 左上頂點(diǎn),4鄰域
                    # 中心點(diǎn)旁邊3個(gè)點(diǎn)
                    sum = int(cur_pixel) \
                          + int(img[x, y + 1]) \
                          + int(img[x + 1, y]) \
                          + int(img[x + 1, y + 1])
                    if sum <= 2 * 245:
                        img[x, y] = 0
                elif x == height - 1:  # 右上頂點(diǎn)
                    sum = int(cur_pixel) \
                          + int(img[x, y + 1]) \
                          + int(img[x - 1, y]) \
                          + int(img[x - 1, y + 1])
                    if sum <= 2 * 245:
                        img[x, y] = 0
                else:  # 最上非頂點(diǎn),6鄰域
                    sum = int(img[x - 1, y]) \
                          + int(img[x - 1, y + 1]) \
                          + int(cur_pixel) \
                          + int(img[x, y + 1]) \
                          + int(img[x + 1, y]) \
                          + int(img[x + 1, y + 1])
                    if sum <= 3 * 245:
                        img[x, y] = 0
            elif y == width - 1:  # 最下面一行
                if x == 0:  # 左下頂點(diǎn)
                    # 中心點(diǎn)旁邊3個(gè)點(diǎn)
                    sum = int(cur_pixel) \
                          + int(img[x + 1, y]) \
                          + int(img[x + 1, y - 1]) \
                          + int(img[x, y - 1])
                    if sum <= 2 * 245:
                        img[x, y] = 0
                elif x == height - 1:  # 右下頂點(diǎn)
                    sum = int(cur_pixel) \
                          + int(img[x, y - 1]) \
                          + int(img[x - 1, y]) \
                          + int(img[x - 1, y - 1])

                    if sum <= 2 * 245:
                        img[x, y] = 0
                else:  # 最下非頂點(diǎn),6鄰域
                    sum = int(cur_pixel) \
                          + int(img[x - 1, y]) \
                          + int(img[x + 1, y]) \
                          + int(img[x, y - 1]) \
                          + int(img[x - 1, y - 1]) \
                          + int(img[x + 1, y - 1])
                    if sum <= 3 * 245:
                        img[x, y] = 0
            else:  # y不在邊界
                if x == 0:  # 左邊非頂點(diǎn)
                    sum = int(img[x, y - 1]) \
                          + int(cur_pixel) \
                          + int(img[x, y + 1]) \
                          + int(img[x + 1, y - 1]) \
                          + int(img[x + 1, y]) \
                          + int(img[x + 1, y + 1])

                    if sum <= 3 * 245:
                        img[x, y] = 0
                elif x == height - 1:  # 右邊非頂點(diǎn)
                    sum = int(img[x, y - 1]) \
                          + int(cur_pixel) \
                          + int(img[x, y + 1]) \
                          + int(img[x - 1, y - 1]) \
                          + int(img[x - 1, y]) \
                          + int(img[x - 1, y + 1])

                    if sum <= 3 * 245:
                        img[x, y] = 0
                else:  # 具備9領(lǐng)域條件的
                    sum = int(img[x - 1, y - 1]) \
                          + int(img[x - 1, y]) \
                          + int(img[x - 1, y + 1]) \
                          + int(img[x, y - 1]) \
                          + int(cur_pixel) \
                          + int(img[x, y + 1]) \
                          + int(img[x + 1, y - 1]) \
                          + int(img[x + 1, y]) \
                          + int(img[x + 1, y + 1])
                    if sum <= 4 * 245:
                        img[x, y] = 0

    return img


def _get_dynamic_binary_image(filedir, img_name):
    '''
    自適應(yīng)閥值二值化
    '''
    filename = './' + img_name.split('.')[0] + '-binary.png'
    img_name = filedir + '/' + filename
    im = cv2.imread(img_name)
    im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

    th1 = cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 1)

    return th1


def recognize(image):

    filedir = './'  # 驗(yàn)證碼路徑

    for file in os.listdir(filedir):
        if fnmatch(file, image):
            img_name = file
            # 自適應(yīng)閾值二值化
            im = _get_dynamic_binary_image(filedir, img_name)
            # # 去除邊框
            im = clear_border(im, img_name)
            # 對(duì)圖片進(jìn)行干擾線降噪
            im = interference_line(im, img_name)
            # 對(duì)圖片進(jìn)行點(diǎn)降噪
            im = interference_point(im, img_name)
            filename = './' + img_name.split('.')[0] + '-interferencePoint.png'  # easy_code為保存路徑
            cv2.imwrite(filename, im)  # 保存圖片
            text = pytesseract.image_to_string(im, lang="eng",
                                               config='--psm 6 digits')  # config=digits只識(shí)別數(shù)字
    return text

    '''
    --psm 參數(shù)含義
    0:定向腳本監(jiān)測(cè)(OSD)
    1: 使用OSD自動(dòng)分頁(yè)
    2 :自動(dòng)分頁(yè),但是不使用OSD或OCR(Optical Character Recognition,光學(xué)字符識(shí)別)
    3 :全自動(dòng)分頁(yè),但是沒(méi)有使用OSD(默認(rèn))
    4 :假設(shè)可變大小的一個(gè)文本列。
    5 :假設(shè)垂直對(duì)齊文本的單個(gè)統(tǒng)一塊。
    6 :假設(shè)一個(gè)統(tǒng)一的文本塊。
    7 :將圖像視為單個(gè)文本行。
    8 :將圖像視為單個(gè)詞。
    9 :將圖像視為圓中的單個(gè)詞。
    10 :將圖像視為單個(gè)字符。
    '''

到此這篇關(guān)于Python+Selenium+Pytesseract實(shí)現(xiàn)圖片驗(yàn)證碼識(shí)別的文章就介紹到這了,更多相關(guān)Python圖片驗(yàn)證碼識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 拿來(lái)就用!Python批量合并PDF的示例代碼

    拿來(lái)就用!Python批量合并PDF的示例代碼

    這篇文章主要介紹了Python批量合并PDF的示例代碼,幫助大家更好的理解和學(xué)習(xí)Python,感興趣的朋友可以了解下
    2020-08-08
  • django使用xadmin的全局配置詳解

    django使用xadmin的全局配置詳解

    今天小編就為大家分享一篇django使用xadmin的全局配置詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Win10用vscode打開(kāi)anaconda環(huán)境中的python出錯(cuò)問(wèn)題的解決

    Win10用vscode打開(kāi)anaconda環(huán)境中的python出錯(cuò)問(wèn)題的解決

    這篇文章主要介紹了Win10用vscode打開(kāi)anaconda環(huán)境中的python出錯(cuò),本文給大家分享解決方案,給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 圣誕節(jié)教你用Python繪制愛(ài)心圣誕樹(shù)

    圣誕節(jié)教你用Python繪制愛(ài)心圣誕樹(shù)

    圣誕節(jié)快要到了,心血來(lái)潮,寫(xiě)段代碼給大家介紹下基于Python繪制愛(ài)心圣誕樹(shù)的方法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-12-12
  • python使用turtle庫(kù)與random庫(kù)繪制雪花

    python使用turtle庫(kù)與random庫(kù)繪制雪花

    這篇文章主要為大家詳細(xì)介紹了python使用turtle庫(kù)與random庫(kù)繪制雪花,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python+matplotlib繪制餅圖和堆疊圖

    Python+matplotlib繪制餅圖和堆疊圖

    Matplotlib是Python的繪圖庫(kù),它能讓使用者很輕松地將數(shù)據(jù)圖形化,并且提供多樣化的輸出格式。本文將為大家介紹如何用matplotlib繪制餅圖和堆疊圖,感興趣的朋友可以學(xué)習(xí)一下
    2022-04-04
  • Python 中@lazyprop 裝飾器的用法

    Python 中@lazyprop 裝飾器的用法

    這篇文章主要介紹了Python 中@lazyprop 裝飾器的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python字典的基本用法實(shí)例分析【創(chuàng)建、增加、獲取、修改、刪除】

    Python字典的基本用法實(shí)例分析【創(chuàng)建、增加、獲取、修改、刪除】

    這篇文章主要介紹了Python字典的基本用法,結(jié)合具體實(shí)例形式分析了Python字典的創(chuàng)建、增加、獲取、修改、刪除等基本操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • 解讀pandas.DataFrame.corrwith

    解讀pandas.DataFrame.corrwith

    這篇文章主要介紹了解讀pandas.DataFrame.corrwith,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • python中l(wèi)eastsq函數(shù)的使用方法

    python中l(wèi)eastsq函數(shù)的使用方法

    這篇文章主要介紹了python中l(wèi)eastsq函數(shù)的使用方法,leastsq作用是最小化一組方程的平方和,下面文章舉例說(shuō)明詳細(xì)內(nèi)容,具有一的參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03

最新評(píng)論

甘洛县| 台南县| 双流县| 清远市| 江永县| 大化| 雅江县| 霍城县| 隆昌县| 随州市| 峨眉山市| 介休市| 防城港市| 汾西县| 武威市| 淮南市| 平江县| 永州市| 汉阴县| 凤庆县| 神农架林区| 西乡县| 吴堡县| 兰州市| 万盛区| 南昌市| 桂阳县| 开江县| 凉城县| 当涂县| 桓仁| 河间市| 广河县| 平和县| 抚松县| 库车县| 钟祥市| 南汇区| 普安县| 乐清市| 乌鲁木齐市|