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

news/2025/9/22 22:45:42/文章来源:https://www.cnblogs.com/ocr12/p/19106271

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

一、问题分析

粘连验证码的典型特征:

字符之间边界模糊,甚至部分笔画重叠;
更多内容访问ttocr.com或联系1436423940
简单的二值化无法区分不同字符;

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

解决思路:

通过二值化得到字符轮廓;

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

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

再逐一送入 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.mzph.cn/news/910632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析:【Spark+Hive+hadoop】基于spark+hadoop基于大数据的人口普查收入数据分析与可视化系统

深入解析:【Spark+Hive+hadoop】基于spark+hadoop基于大数据的人口普查收入数据分析与可视化系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…

甜蜜高端定制网站报考二级建造师官网

目录 一、响应 Control,RestController 1.Controller的源码&#xff0c;代表什么意思 2.返回数据 Responsebody 3.返回HTML片段 4.返回JSON 5.那么假如我们使用集合会怎么样呢 设置状态码&#xff0c;虽然不影响展示&#xff0c;但是确实显示起来也就是401的情况。 2.我…

外贸网站建设解决方案住建部关于epc总承包文件

我是在edge浏览器中安装的xpath&#xff0c;需要安装的朋友可以参考下面这篇博客最新版edge浏览器中安装xpath插件 一、xpathd的使用 安装lxml pip install lxml ‐i https://pypi.douban.com/simple导入lxml.etree from lxml import etreeetree.parse() 解析本地文件 htm…

珠海网站建设乐云seo在线制作商机网项目

前言 安装心得 经过多种方式操作&#xff0c;发现二进制方法安装太复杂&#xff0c;证书生成及其手工操作太多了&#xff0c;没有安装成功&#xff1b;helm方式的安装&#xff0c;v1.7.0的chart包执行安装会报错&#xff0c;手工修复了报错并修改了镜像地址&#xff0c;还是各…

网站开发包括网站过程wordpress使用百度编辑器

《C语言21(顺序结构程序设计之1).ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《C语言21(顺序结构程序设计之1).ppt(28页珍藏版)》请在人人文库网上搜索。1、上一节我们学了,C语言程序的结构 C语言程序的书写规范,第2章 最简单的C程序设计,-顺序程序设计,C程序常…

东莞网站建设公司排名简单广告设计软件

我的2023年总结 呵,时间过得真快啊! 有多快呢? 像烟花,一瞬间。 一瞬间 就在一瞬间 一场梦 梦了一千年 一转眼 只是一转眼 梦已醒 却过了一千年这是写年总结以来的第四年, 2023年往事回首三个字可概括:恍,荒,慌。 文章目录 我的2023年总结1、往年总结2、旅行如书2.1、…

平湖网站制作wordpress发邮件更新

摘要&#xff1a; 2017年5月&#xff0c;Google、IBM和Lyft发布了开源服务网格框架Istio&#xff0c;提供微服务的连接、管理、监控和安全保护。Istio提供了一个服务间通信的基础设施层&#xff0c;解耦了应用逻辑和服务访问中版本管理、安全防护、故障转移、监控遥测等切面的问…

网站的域名技巧和空间选择新浪门户网站是谁做的

接口测试完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;接口测试&#xff0c;学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标&#xff0c;RESTFUL1. 理解接口的概念,2.什么是接口测试…

查看网站的 cms浙江城乡住房建设厅网站

MongoDB 支持Hangfire库。通过使用这个库&#xff0c;您可以将所有作业信息存储在 MongoDB 中。要安装 Hangfire MongoDB Storage&#xff0c;请在 Nuget 包管理器控制台中运行以下命令&#xff1a;PM> Install-Package Hangfire.Mongopublic void ConfigureServices(IServi…

自己做的网站怎么被搜录宁波seo基础入门

简介 本文主要通过对啥都会一点研究生系列进行总结&#xff0c;对关键代码进行注释&#xff0c;方便使用以及复习。 1 基础功能 1.1.显示图片 import cv2 # 读取图片 img cv2.imread("Resources/lena.png") # 显示图片 cv2.imshow("Lena Soderberg",img…

网站建设公司包括哪些方面网站开发服务器多少钱

vue跨域解决方法 vue项目中&#xff0c;前端与后台进行数据请求或者提交的时候&#xff0c;如果后台没有设置跨域&#xff0c;前端本地调试代码的时候就会报“No Access-Control-Allow-Origin header is present on the requested resource.” 这种跨域错误。 要想本地正常的调…

python用于网站开发软文营销网

C语言求n的阶乘 递归法 思路&#xff1a;因为n的阶乘是 nn-1…321,所以设定初始条件为1 &#xff0c;递归使用n*函数&#xff08;n-1&#xff09;这样就可以不断接近初始条件。 代码如下 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int FindFact(int n) {if…

打代码怎么做网站线上推广平台有哪些

文章目录 传统的处理错误的方式C异常C异常的使用抛异常的举例异常的重新抛出异常规范 自定义异常体系C标准库中的异常体系异常的优缺点 本篇总结的是C中关于异常的内容 传统的处理错误的方式 在C语言中&#xff0c;对于传统的错误方式有 终止程序&#xff1a;例如assert&…

part 8

T1 普通的二分+贪心 T2 定义 \(f_{i,j,k}\) 表示考虑完前 \(i\) 个节点,有 \(j\) 棵树,前 \(i\) 个节点还缺少 \(k\) 个儿子,每次转移钦定 \(i\) 的儿子数量即可

【本地音乐库】的搭建管理工具推荐

下载Gomusic:提取歌单目录我一般复制贴到 flowus 或者 notion 之类的笔记软件,全选改为待办块,下载一首check一个。还可以转为多维表,检索关键词可批量check同个歌手。MP3搜集:知名度高的流行歌很好找,XX音乐网一…

扭曲变形验证码的图像处理与识别思路

为了进一步防止自动化程序,很多验证码会在字符上加入波浪形扭曲或旋转变形。这种验证码的难点在于:字符形状被严重改变,传统 OCR 在未经校正的情况下几乎无法识别。本文将介绍一种基于几何校正与投影分析的识别流程…

专业汽车网站东营网站建设入门

I/O设备模型 绝大部分的嵌入式系统都包括一些I/O&#xff08;Input/Outut&#xff0c;输入/输出&#xff09;设备&#xff0c;例如仪器上的数据显示屏、工业设备上的串口通信、数据采集设备上用于保存数据的Flash或SD卡&#xff0c;以及网络设备的以太网接口等。 I/O设备模型…

创新的网站建站企业宣传片拍摄公司

CF785D Anton and School - 2 题意&#xff1a; 给定一个长度≤210^5由(和)组成的字符串&#xff0c;问有多少个子串&#xff08;可以不连续&#xff09;&#xff0c;前半部分是由(组成后半部分由)组成. 题解&#xff1a; 怎么括号匹配能出这么多题 如何才能不重不漏的选出…

常用的seo查询工具济宁网站建设优化亿峰

1、问题 Android Studio debug调试项目卡在waiting for debugger界面2、解决办法 一开始从启adb服务adb stop-server adb start-server 发现没什么用&#xff0c;然后呢&#xff0c;估计是很多app再运行&#xff0c;然后我就重启了Android studio,问题就解决了如果要是万一还不…

网站 演示代码中国目前最好的搜索引擎

理解线程同步线程的数据访问在并行&#xff08;多线程&#xff09;环境中&#xff0c;不可避免地会存在多个线程同时访问某个数据的情况。多个线程对共享数据的访问有下面3种情形&#xff1a;多个线程同时读取数据&#xff1b;单个线程更新数据&#xff0c;此时其他线程读取数据…