如何从HTML页面裁剪验证码图片并结合Python OCR提取数字
验证码图片裁剪与数字提取完整方案
一、先完成验证码图片裁剪
你需要先将目标验证码图片保存到本地,再通过代码裁剪出有效验证码区域。以下是两种实用裁剪方法:
方法1:用OpenCV裁剪
通过像素坐标确定裁剪范围(需自行调整x1,y1,x2,y2,对应验证码在图片中的左上角、右下角坐标):
import cv2 # 读取原始验证码图片 original_img = cv2.imread("你的原始验证码图片路径.jpg") # 裁剪区域:y1到y2行,x1到x2列(示例坐标需根据实际图片修改) x1, y1, x2, y2 = 50, 20, 250, 80 cropped_img = original_img[y1:y2, x1:x2] # 保存裁剪后的图片 cv2.imwrite("cropped_captcha.png", cropped_img)
方法2:用PIL裁剪
若习惯使用PIL库,可采用此方式:
from PIL import Image # 打开原始验证码图片 img = Image.open("你的原始验证码图片路径.jpg") # 裁剪区域格式:(左, 上, 右, 下) cropped_img = img.crop((50, 20, 250, 80)) # 保存裁剪后的图片 cropped_img.save("cropped_captcha.png")
坐标获取技巧:用系统自带画图工具打开图片,鼠标移动到验证码角落,底部会显示对应像素坐标,以此调整裁剪参数。
二、整合裁剪与数字提取流程
将裁剪步骤嵌入你提供的提取代码,实现从原始图片到数字提取的一站式操作:
import cv2 import numpy as np import pytesseract # 原始图片路径 original_im_path = "E:/" original_im_name = "原始验证码图片.jpg" # 裁剪区域坐标(根据实际图片调整) x1, y1, x2, y2 = 50, 20, 250, 80 # 读取原始图片并直接裁剪 img = cv2.imread(original_im_path + original_im_name)[y1:y2, x1:x2] # 红色通道阈值处理 th=185 img[img[...,2]>th]=0 # 转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理 binary = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1] # 放大图片(适配小尺寸验证码) scale_ = 5 width = int(img.shape[1] * scale_ ) height = int(img.shape[0] * scale_ ) dim = (width, height) resized = cv2.resize(binary, dim, interpolation = cv2.INTER_CUBIC) # 形态学腐蚀去噪 resized = cv2.erode(resized, None) # OCR提取数字 txt = pytesseract.image_to_string(resized, config='--psm 13 outputbase digits') # 显示处理后的图片 cv2.namedWindow("output", cv2.WINDOW_NORMAL) cv2.imshow("output", resized) cv2.waitKey(0) cv2.destroyAllWindows() print("提取的验证码数字:", txt)
三、注意事项
- 务必根据实际验证码图片调整裁剪坐标,否则无法精准提取有效区域。
- 确保已安装依赖库:
pip install opencv-python numpy pytesseract,且Tesseract OCR引擎已配置到系统环境变量。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

