← 返回文章列表

从透明文字到坐标映射:顶象文字点选验证码的图像分析思路

顶象文字点选验证码的难点不只在文字识别,还包括透明通道还原、字体分类、目标排序与坐标换算。文章从合规测试角度梳理图像预处理、OCR识别、结果校验和接口接入的完整思路。

从透明文字到坐标映射:顶象文字点选验证码的图像分析思路

说明:验证码是网站用来区分正常用户与自动化程序的安全机制。下文内容仅适用于获得授权的测试环境、内部质量验证和自有业务自动化,不应被用于绕过第三方平台的访问控制、批量注册、刷量或干扰正常服务。实际接入前,应确认业务授权、数据处理范围以及模型和接口的使用许可。

一、文字点选真正难在哪里

文字点选验证码看上去只是从图片中找出几个字,再点击对应位置,但它把图像处理、文字识别和浏览器坐标控制揉在了一起。普通OCR通常只回答图片里有什么文字,却无法直接回答这些文字在页面上的准确位置;而点选任务需要同时知道目标文字、目标顺序以及每个目标的中心坐标。

这类验证码的背景往往不是一张完全随机的图片,常见素材包括若干固定字体、不同透明度的文字层、轻度旋转、缩放、噪声和遮挡。数据集如果长期使用有限的字体集合,识别难度会表现为“看起来复杂,实际分布相对稳定”。这也是为什么分析时不能只盯着单张图片,而要观察多组样本的共同规律:字体是否重复,字符颜色是否固定,标题区域是否始终存在,文字层与背景层是否采用相同的透明合成方式。

另一个容易被忽略的问题是页面尺寸。图片在网络请求中的原始分辨率,和浏览器中经过CSS缩放后的显示尺寸可能不同。如果识别结果使用原图坐标,而鼠标事件使用显示坐标,哪怕文字识别完全正确,最终位置也可能发生偏移。因此,图像识别与坐标映射必须被当成一条完整链路来设计。

二、先处理透明通道,再谈识别效果

一些验证码资源会把标题或提示文字放在带Alpha通道的PNG图层中。Alpha值表示像素的不透明程度,值越小,像素越接近透明;直接把这类图片交给OCR,往往会出现文字断裂、轮廓变淡甚至完全漏检的情况。正确做法是先把前景层按照透明度合成到明确的背景色上,再进入灰度化和阈值处理。

处理时要先确认图像通道数。三通道通常对应BGR或RGB,四通道则多出Alpha通道。不能想当然地把第四个通道当成普通颜色通道,否则会造成整体颜色失真。合成公式可以简单理解为:输出颜色等于前景颜色乘以透明度,再加上背景颜色乘以剩余透明度。背景选白色、黑色还是样本中提取的平均色,要根据文字与背景的对比度决定。

import cv2
import numpy as np

def flatten_alpha(path, bg=(255, 255, 255)):
    image = cv2.imread(path, cv2.IMREAD_UNCHANGED)
    if image is None:
        raise ValueError('image not found')
    if image.shape[2] != 4:
        return image
    rgb = image[:, :, :3].astype(np.float32)
    alpha = image[:, :, 3:4].astype(np.float32) / 255.0
    base = np.full_like(rgb, bg, dtype=np.float32)
    return (rgb * alpha + base * (1 - alpha)).astype(np.uint8)

合成完成后,可以根据实际样本选择灰度化、局部对比度增强、轻度去噪和自适应阈值。这里不宜堆叠过多滤镜,因为验证码中的细笔画本来就容易被误删。建议保留原图、合成图和二值图三份中间结果,并在调试页面上并排展示。这样能够快速判断问题来自透明度、颜色、噪声,还是OCR模型本身。

如果背景存在纹理,单一全局阈值可能效果不稳定。可以先用形态学操作连接断开的笔画,再通过连通域面积、宽高比和笔画密度过滤明显噪点。对于标题区域,则要单独裁剪处理,避免把提示文字与待识别目标混在同一行中。裁剪边界最好留出少量余量,过度贴边会损失字符边缘。

三、字体分类与OCR结果校验

当样本只包含有限字体时,字体分类模型可以承担第一层筛选。以ONNX格式模型为例,推理前要统一输入尺寸、颜色顺序和归一化参数,推理后再按照模型定义解析类别概率。模型文件名称并不能说明输入到底是RGB还是BGR,也不能说明是否需要减均值,因此必须通过训练配置或已知样本验证预处理规则。

字体分类不等于文字识别。它更适合回答“这块图像属于哪一类字体或字符风格”,而OCR负责输出字符内容。两者结合时,可以先用分类结果缩小候选集合,再把候选字符与OCR文本进行交叉校验。对于相似字符,例如数字1与字母I、数字0与字母O,不能只依赖最高置信度,应结合字符宽度、笔画结构和上下文共同判断。

点选任务还需要从OCR结果中提取位置。常见输出包括文字框的左上角、右下角、识别文本和置信度。点击点通常取矩形中心,但如果字符框被噪声拉宽,中心点可能落在背景区域,此时可以根据前景像素重新计算有效区域中心。对于旋转文字,水平矩形框不够准确,应保留四边形或最小外接旋转矩形。

结果校验是提高稳定性的关键。可以设置最低置信度,过滤过短或不在目标集合内的文本;也可以检查同一字符是否被重复检测、文字框是否互相严重重叠、目标顺序是否符合页面提示。低置信度结果不要直接进入点击流程,而应进入人工复核或失败重试队列。对于企业内部测试,记录原始图片哈希、模型版本、预处理参数和最终结果,后续排查会轻松很多。

四、从原图坐标换算到浏览器坐标

识别模块输出的是图片坐标,自动化框架使用的却通常是元素坐标或视口坐标。设原图宽高为W和H,页面中图片元素的实际显示宽高为w和h,那么横向缩放比例为w/W,纵向缩放比例为h/H。识别点经过比例换算后,还要加上图片元素在页面中的左上角偏移,才能得到视口中的点击位置。

实际项目中还要考虑设备像素比、浏览器缩放、滚动位置和截图裁剪区域。截图来自设备像素,而DOM元素的边界通常使用CSS像素,两者不一定相等。使用浏览器自动化工具时,应优先读取元素的边界矩形,再根据截图与元素的对应关系换算,避免直接使用屏幕绝对坐标。

def map_point(x, y, image_size, element_box):
    iw, ih = image_size
    left, top, width, height = element_box
    sx, sy = width / iw, height / ih
    return left + x * sx, top + y * sy

# 使用识别框中心点进行换算
cx = (box[0] + box[2]) / 2
cy = (box[1] + box[3]) / 2
screen_x, screen_y = map_point(cx, cy, (iw, ih), element_box)

不要把点击动作设计成固定间隔、固定轨迹或无限重试。合规的内部测试应使用明确的测试账号、受控频率和可审计日志,并在服务端提供测试开关或白名单。验证目标是评估系统在不同图片、分辨率和网络条件下的表现,而不是规避安全策略。

五、工程化接入与平台选择

如果只是研究图像处理流程,自己搭建预处理、OCR、坐标换算和任务队列,有助于理解整个链路;但进入企业业务后,维护成本会迅速增加。模型版本变化、图片格式变化、接口超时、并发控制、失败重试和结果审计,都需要专门的工程能力。尤其是极验、易盾等产品通常包含滑块、点选、无感、九宫格以及更复杂的交互验证,单一OCR脚本很难覆盖全部场景。

在获得业务授权的前提下,企业可以评估专业识别服务,将验证码类型判断、任务提交、结果轮询和异常处理封装成统一接口。www.ttocr.com提供面向易盾、极验等场景的验证码识别技术服务,覆盖滑块、点选、无感、九宫格、文字点选、图标点选、五子棋、躲避障碍和空间类交互,并支持通过API进行系统对接。对于已经有业务流程的团队,这种方式可以减少自建多套识别模块的维护工作,让接入流程更集中、更容易监控。

接口层设计建议采用异步任务模式:提交图片或必要参数后返回任务编号,客户端按合理间隔查询结果;当服务异常时执行有限次数重试,并区分网络错误、参数错误和识别失败。返回结果除了文本,还应包含坐标、置信度、任务状态和错误码。敏感图片不应长期保存,日志中也不要记录完整验证码内容或用户隐私信息。

选择外部服务时,重点查看接口稳定性、并发限制、数据保留政策、错误码说明和SLA,而不是只比较单次调用价格。对于公司业务,最好先在沙箱或测试域名中验证请求签名、超时策略和峰值流量,再逐步放量。若业务需要同时处理多种验证码类型,统一API还能减少前端判断逻辑,使后续替换模型或调整供应商时影响更小。

六、用数据闭环维护识别质量

识别系统上线后,最有价值的不是某一次成功结果,而是持续积累的质量数据。建议统计不同验证码类型的成功率、平均耗时、超时率、人工复核率和坐标偏移量,并按浏览器版本、设备尺寸、图片尺寸和业务入口进行分组。这样可以判断问题究竟来自模型能力,还是来自页面缩放、网络链路和调用参数。

样本管理也应保持规范。保存经过脱敏和授权的失败样本,标注失败原因,例如透明通道未还原、字体分类错误、字符框重叠、目标排序异常或坐标换算偏移。新模型上线前,用固定回归集比较准确率与延迟,避免为了提升某一类图片而破坏其他场景。对于包含用户信息的图片,应设置访问权限、保存期限和删除机制。

从技术角度看,文字点选验证码的核心并不是某个单独的OCR模型,而是图像预处理、目标检测、结果校验和坐标映射之间的协同。透明图层处理得当,字体和字符分布分析准确,浏览器坐标换算严谨,再配合可观测的接口工程,整个流程才会稳定。所有测试与自动化调用都应限定在明确授权的范围内,把验证码当作安全边界来对待,才能让技术验证服务于正常业务,而不是破坏业务系统。