图片验证码识别学习

1.使用pytesseract+pillow实现验证码处理

python 复制代码
import cv2 as cv
import pytesseract
from PIL import Image

def recognize_text(image):
    # 调整图像大小,使其变大,便于后续处理
    scale_percent = 400  # 将图像放大到原来的400%
    width = int(image.shape[1] * scale_percent / 100)
    height = int(image.shape[0] * scale_percent / 100)
    dim = (width, height)
    resized_image = cv.resize(image, dim, interpolation=cv.INTER_CUBIC)

    # 边缘保留滤波去噪
    dst = cv.pyrMeanShiftFiltering(resized_image, sp=20, sr=60)
    # 转换为灰度图像
    gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
    # 二值化处理
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    # 形态学操作,腐蚀后膨胀
    erode = cv.erode(binary, None, iterations=1)
    dilate = cv.dilate(erode, None, iterations=1)  # 精细调整,避免过度膨胀
    # 显示二值处理后的图像
    cv.imshow('Dilated Image', dilate)
    # 反色,使背景变为白色,文字变为黑色便于识别
    cv.bitwise_not(dilate, dilate)
    cv.imshow('Binary Image', dilate)
    # 将图像转换为 PIL 图像以供 pytesseract 使用
    test_message = Image.fromarray(dilate)
    # 使用 pytesseract 识别文字
    text = pytesseract.image_to_string(test_message, config='--psm 7')  # psm 7:处理单行文本
    # 去除空格
    text = text.replace(" ", "")
    print(f'识别结果:{text}')

# 读取输入图像
src = cv.imread('D:\\yzm.png')
cv.imshow('Input Image', src)
# 调用识别函数
recognize_text(src)
# 等待用户按键操作
cv.waitKey(0)
cv.destroyAllWindows()

上面代码可以直接作为一个模板进行验证码处理使用,我这些给出,并在下面应用到实战:

python 复制代码
import cv2 as cv
import pytesseract
from PIL import Image

def process_captcha_image(image_path):
    # 读取输入图像
    image = cv.imread(image_path)
    if image is None:
        raise FileNotFoundError(f"The image at path {image_path} could not be found.")
    
    # 调整图像大小,使其变大,便于后续处理
    scale_percent = 400  # 将图像放大到原来的400%
    width = int(image.shape[1] * scale_percent / 100)
    height = int(image.shape[0] * scale_percent / 100)
    dim = (width, height)
    resized_image = cv.resize(image, dim, interpolation=cv.INTER_CUBIC)

    # 边缘保留滤波去噪
    dst = cv.pyrMeanShiftFiltering(resized_image, sp=20, sr=60)
    # 转换为灰度图像
    gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
    # 二值化处理
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    # 形态学操作,腐蚀后膨胀
    erode = cv.erode(binary, None, iterations=1)
    dilate = cv.dilate(erode, None, iterations=1)  # 精细调整,避免过度膨胀
    # 反色,使背景变为白色,文字变为黑色便于识别
    cv.bitwise_not(dilate, dilate)
    # 将图像转换为 PIL 图像以供 pytesseract 使用
    test_message = Image.fromarray(dilate)
    # 使用 pytesseract 识别文字
    text = pytesseract.image_to_string(test_message, config='--psm 7')  # psm 7:处理单行文本
    # 去除空格
    text = text.replace(" ", "")
    return text

def recognize_text_from_image_path(image_path):
    try:
        text = process_captcha_image(image_path)
        print(f'识别结果:{text}')
    except FileNotFoundError as e:
        print(e)

# 调用函数,传入验证码图片路径
recognize_text_from_image_path('D:\\yzm.png')

# 等待用户按键操作(测试环境中可以选择是否保留)
cv.waitKey(0)
cv.destroyAllWindows()

2.实战练习,pytesseract实用

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import pytesseract
from PIL import Image
import time

driver = webdriver.Chrome()

driver.get('https://captcha7.scrape.center/')
time.sleep(3)

search_name = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[1]/div/div/input')
search_password = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[2]/div/div/input')
search_name.send_keys('admin')
search_password.send_keys('admin')
yzm_img = driver.find_element(By.XPATH,'//*[@id="captcha"]')
time.sleep(2)
# 验证码操作
yzm_path = 'D:\\yzm.png'
yzm_img.screenshot(yzm_path)
im = Image.open('D:\\yzm.png')


text = pytesseract.image_to_string(Image.open(r'D:\\yzm.png'))
search_yzm = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[3]/div/div/div[1]/div/input')
search_yzm.send_keys(text)

search_button = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[4]/div/button/span')
search_button.click()
time.sleep(5)

driver.quit()

发现结果并不是很准确,于是进行 使用pytesseract+pillow实现验证码处理

3. pytesseract进阶处理

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import pytesseract
from PIL import Image
import time
import cv2 as cv

def process_captcha_image(image_path):
    # 读取输入图像
    image = cv.imread(image_path)
    if image is None:
        raise FileNotFoundError(f"The image at path {image_path} could not be found.")

    # 调整图像大小,使其变大,便于后续处理
    scale_percent = 400  # 将图像放大到原来的400%
    width = int(image.shape[1] * scale_percent / 100)
    height = int(image.shape[0] * scale_percent / 100)
    dim = (width, height)
    resized_image = cv.resize(image, dim, interpolation=cv.INTER_CUBIC)

    # 边缘保留滤波去噪
    dst = cv.pyrMeanShiftFiltering(resized_image, sp=20, sr=60)
    # 转换为灰度图像
    gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
    # 二值化处理
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    # 形态学操作,腐蚀后膨胀
    erode = cv.erode(binary, None, iterations=1)
    dilate = cv.dilate(erode, None, iterations=1)  # 精细调整,避免过度膨胀
    # 反色,使背景变为白色,文字变为黑色便于识别
    cv.bitwise_not(dilate, dilate)
    # 将图像转换为 PIL 图像以供 pytesseract 使用
    test_message = Image.fromarray(dilate)
    # 使用 pytesseract 识别文字
    text = pytesseract.image_to_string(test_message, config='--psm 7')  # psm 7:处理单行文本
    # 去除空格
    text = text.replace(" ", "")
    return text

def recognize_text_from_image_path(image_path):
    try:
        text = process_captcha_image(image_path)
        return text
    except FileNotFoundError as e:
        print(e)
        return ""

driver = webdriver.Chrome()

driver.get('https://captcha7.scrape.center/')
time.sleep(3)

search_name = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[1]/div/div/input')
search_password = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[2]/div/div/input')
search_name.send_keys('admin')
search_password.send_keys('admin')
yzm_img = driver.find_element(By.XPATH,'//*[@id="captcha"]')
time.sleep(2)

# 验证码操作
yzm_path = 'D:\\yzm.png'
yzm_img.screenshot(yzm_path)
captcha_text = recognize_text_from_image_path(yzm_path)

search_yzm = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[3]/div/div/div[1]/div/input')
search_yzm.send_keys(captcha_text)

search_button = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[4]/div/button/span')
search_button.click()
time.sleep(5)

driver.quit()

4.复杂情况,超级进阶版识别

经过此时pytesseract+pillow进阶处理仍然无法识别到验证码,需要进行深度学习模型和模拟训练模型,或者使用打码平台处理

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import ddddocr

driver = webdriver.Chrome()

driver.get('https://captcha8.scrape.center/')
time.sleep(3)

search_name = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[1]/div/div/input')
search_password = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[2]/div/div/input')
search_name.send_keys('admin')
search_password.send_keys('admin')
yzm_img = driver.find_element(By.XPATH,'//*[@id="captcha"]')
time.sleep(5)
# 验证码操作
yzm_path = 'D:\\yzm.png'
yzm_img.screenshot(yzm_path)
time.sleep(3)

# ocr = ddddocr.DdddOcr()
ocr = ddddocr.DdddOcr(beta=True)
# 读取图像
with open("D:\\yzm.png", "rb") as image_file:
    image = image_file.read()

result = ocr.classification(image)


search_yzm = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[3]/div/div/div[1]/div/input')
search_yzm.send_keys(result)

search_button = driver.find_element(By.XPATH,'//*[@id="app"]/div[2]/div/div/div/div/div/form/div[4]/div/button/span')
search_button.click()
time.sleep(5)

driver.quit()
相关推荐
Jurio.8 分钟前
【SPIE单独出版审核,见刊检索稳定!】2024年遥感技术与图像处理国际学术会议(RSTIP 2024,11月29-12月1日)
大数据·图像处理·人工智能·深度学习·机器学习·计算机视觉·学术会议
真的是我29 分钟前
基于MATLAB课程设计-图像处理完整版
图像处理·人工智能·计算机视觉·matlab
折枝寄北14 分钟前
C语言进阶:二.数据的存储(2)
c语言·开发语言·学习
魔法自动机25 分钟前
Unity3D学习FPS游戏(9)武器音效添加、创建敌人模型和血条
android·学习·游戏
柳鲲鹏37 分钟前
LINUX/CMAKE编译opencv_contrib
linux·opencv·webpack
要加油GW41 分钟前
学习党的二十大精神,推动科技创新和发展
科技·学习
LUwantAC1 小时前
Java学习路线:Maven(一)认识Maven
java·学习·maven
程序猿锦鲤1 小时前
Kafka 消息丢失如何处理?
开发语言·学习·kafka
网络安全学习库1 小时前
基于大语言模型智能体的自主机器学习
人工智能·深度学习·学习·机器学习·ai·语言模型·aigc
Lyqfor1 小时前
Redis学习:BitMap/HyperLogLog/GEO案例 、布隆过滤器BloomFilter、缓存预热+缓存雪崩+缓存击穿+缓存穿透
java·数据库·redis·学习·算法·缓存·1024程序员节