图片验证码识别学习

ops/2024/11/9 9:45:12/

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

import cv2 as cv
import pytesseract
from PIL import Imagedef 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()

 

 

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

import cv2 as cv
import pytesseract
from PIL import Imagedef 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 textdef 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实用

from selenium import webdriver
from selenium.webdriver.common.by import By
import pytesseract
from PIL import Image
import timedriver = 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进阶处理

from selenium import webdriver
from selenium.webdriver.common.by import By
import pytesseract
from PIL import Image
import time
import cv2 as cvdef 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 textdef recognize_text_from_image_path(image_path):try:text = process_captcha_image(image_path)return textexcept 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进阶处理仍然无法识别到验证码,需要进行深度学习模型和模拟训练模型,或者使用打码平台处理 

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import ddddocrdriver = 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()

 


http://www.ppmy.cn/ops/131896.html

相关文章

【湖南-常德】《市级信息化建设项目初步设计方案编制规范和支出预算编制标准(试行)》-省市费用标准解读系列05

《市级信息化建设项目初步设计方案编制规范和支出预算编制标准(试行)》(常行审 〔2023〕7号)标准是湖南省常德市行政审批服务局、常德市财政局2023年12月29日发布的费用标准(了解更多可直接关注我们咨询)。…

尚庭公寓-小程序接口

7. 项目开发 7.4 移动端后端开发 7.4.1 项目初始配置 7.4.1.1 SpringBoot配置 1. 创建application.yml文件 在web-app模块的src/main/resources目录下创建application.yml配置文件,内容如下: server:port: 80812. 创建SpringBoot启动类 在web-app…

鸿蒙HarmonyOS开发生日选择弹框

鸿蒙HarmonyOS开发生日选择弹框 生日选择弹框和城市选择弹框差不多,都是通过观察上一个数据变化来设置自己的数据 一、思路: 一个弹框上建三个compoent,一个年,一个月,一个日。日的数据是根据年和月进行变化的 二、…

主观Bayes方法

1. 不确定性的表示 1️⃣知识的不确定性:IF E THEN (LS,LN) H(P(H)) P ( H ) P(H) P(H):结论 H H H的先验概率,由专家根据经验给出静态强度 L S , L N LS,LN LS,LN:由专家给出,这两个表达式不用记 L S P ( E ∣ H ) P…

Docker 基础命令简介

目录 Docker 基础命令 1. Docker 版本信息 2. 获取 Docker 帮助 3. 列出所有运行中的容器 4. 运行一个新的容器 5. 查看容器日志 6. 停止容器 7. 启动已停止的容器 8. 删除容器 9. 列出所有镜像 10. 拉取镜像 11. 构建镜像 12. 删除镜像 13. 执行命令 14. 查看容…

Git通讲-第二章(1):快照和不可变对象模型

前言 上一篇文章主要介绍些Git起源背后的一些故事背景,从这篇开始将逐渐讲解Git的设计理念,包括分布式控制、快照管理、不可变对象模型和分支模型。其实上述概念都不是孤立的,在讲解中会发现它们是相辅相成的有机整体,实现11大于…

TCP/IP与HTTP协议:概念、关系与工作原理

一、引言 在计算机网络领域,TCP/IP和HTTP协议是至关重要的基础概念。它们在数据传输、网络通信以及互联网应用中发挥着关键作用。理解这些协议的概念、区别以及它们的工作原理,对于深入掌握网络技术和开发网络应用程序具有重要意义。 二、TCP/IP协议 …

React 守卫路由

1.在components文件夹下新建一个Auth.js的文件,里面写入判断token的逻辑: // 导入重定向的路由模块 import { Navigate } from "react-router-dom" // 获取本地token let token window.sessionStorage.getItem(token) function Auth({childr…