当前位置: 首页 > news >正文

字符验证码的分割与识别思路

在验证码设计中,常见的一种防护方式是字符粘连:多个字符之间没有明显的空隙,甚至部分笔画重叠。这种情况使得传统 OCR 很难直接识别。本文将介绍一种基于投影分析与轮廓分割的处理流程,帮助我们从粘连验证码中分离出独立字符。

一、问题分析

粘连验证码的典型特征:

字符之间边界模糊,甚至部分笔画重叠;

简单的二值化无法区分不同字符;

OCR 在整体输入下容易输出错误结果。

解决思路:
更多内容访问ttocr.com或联系1436423940
通过二值化得到字符轮廓;

对二值图像进行垂直投影,寻找字符间的“谷值”;

在谷值附近切割,得到单个字符;

再逐一送入 OCR 识别。

二、实现步骤(Python 示例)

  1. 导入依赖
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    import pytesseract

  2. 读取与灰度化
    img = cv2.imread("captcha_stick.png")
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _, binary = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY_INV)

cv2.imwrite("step1_binary.png", binary)

  1. 垂直投影计算
    h, w = binary.shape
    projection = np.sum(binary, axis=0)

plt.plot(projection)
plt.title("Vertical Projection")
plt.savefig("step2_projection.png")

  1. 根据投影谷值分割字符

找出投影中接近 0 的区域,作为切割点

threshold = np.max(projection) * 0.2
cuts = []
in_gap = False

for x, val in enumerate(projection):
if val < threshold and not in_gap:
cuts.append(x)
in_gap = True
elif val >= threshold and in_gap:
cuts.append(x)
in_gap = False

切割并保存字符

chars = []
for i in range(0, len(cuts)-1, 2):
roi = binary[:, cuts[i]:cuts[i+1]]
chars.append(roi)
cv2.imwrite(f"char_{i//2}.png", roi)

  1. OCR 单字符识别
    for i, c in enumerate(chars):
    text = pytesseract.image_to_string(c, config="--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    print(f"字符{i}: {text.strip()}")
http://www.jsqmd.com/news/161638/

相关文章:

  • Markdown Emoji表情符号:增添技术博客趣味性
  • 云端智能体:AI Agent技术与应用研究报告(2025年)|附50页PDF文件下载
  • PyTorch Exponential Moving Average指数移动平均
  • 基于Java的塔吊租赁智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • Docker Exec进入运行中容器:调试PyTorch应用现场
  • CSRF漏洞概述和原理【黑客渗透测试零基础入门必知必会】零基础入门到精通,收藏这篇就够了
  • PyTorch混合精度训练:AMP机制降低GPU显存消耗
  • C#之如何添加其他项目
  • CUDA Compute Capability计算能力:选择合适GPU型号
  • HuggingFace TrainingArguments参数详解:控制训练行为
  • 2025国内最新数字科技展厅企业top5推荐!服务深耕于四川、成都、广州、北京、云南等地区,国内优质数字展示服务厂家及品牌权威榜单发布,创新重构展示空间生态 - 全局中转站
  • YOLOv5部署到边缘设备:基于PyTorch Mobile的尝试
  • GitHub热门推荐:PyTorch-CUDA-v2.8镜像开源项目实践
  • 无线真机自动化测试全攻略-appium+phthon
  • C#之跨线程调用UI
  • 2025必备10个降AIGC工具,继续教育者必看!
  • Jupyter Notebook代码折叠:提升长脚本阅读体验
  • GitHub Gist分享代码片段:快速传播PyTorch技巧
  • PyTorch Gradient Clipping:稳定大模型训练过程
  • 《代码大全2》前三分之一观后感
  • [NOIP2021] 棋局
  • HuggingFace Inference API调用:无需GPU运行大模型
  • PyTorch-CUDA-v2.8镜像安全性评估:是否适合企业级应用?
  • 【物理】模拟粒子在电场和磁场中的轨迹研究附Matlab代码
  • 第六十七篇
  • AI应用架构师的独特视角:人机协作新范式流程设计最佳实践
  • PyTorch-CUDA-v2.8镜像优势分析:为什么它适合你的大模型项目?
  • 12.22 - 12.28 周总结
  • Jupyter Notebook单元测试:验证PyTorch函数正确性
  • MATLAB代码:基于模型预测控制的楼宇负荷需求响应研究 关键词:楼宇负荷 空调 模型预测控制...