验证码识别过程中切割图片的几种方案

news2025/6/17 7:25:33

目录

方案一:图片均分

方案二:寻找轮廓并截取

方案三:聚类算法

方案四:垂直投影法

源码下载


在用机器学习识别验证码的过程中,我们通常会选择把验证码中的各个字符切割出来然后单独识别,切割质量会直接影响识别精度。在本节我们就来看下如何去切割一张验证码图片。

方案一:图片均分

这种方案实现起来很简单,但只能针对一些简单的验证码,比如下面这种。这类验证码有一个特点:字符占据固定的图片宽度且位置保持不变。

 代码编写如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 读取图片
img = cv.imread("cut1.png")

# 灰度化
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 高斯模糊
img_gaussian = cv.GaussianBlur(img_gray, (9, 9), 0)

# 二值化
ret, img_threshold = cv.threshold(img_gaussian, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)

# 腐蚀处理
kernel = np.ones((3, 3), np.float32)
img_erode = cv.erode(img_threshold, kernel)

# 切割图像,均分成6块
height, width = img_erode.shape
x_gap = width // 6
for i in range(1, 5):
    roi = img_erode[0:height, i*x_gap:(i+1)*x_gap]
    plt.subplot(1, 4, i)
    plt.axis("off")
    plt.imshow(roi, cmap="gray")
plt.show()

运行结果如下:

方案二:寻找轮廓并截取

我们可以用opencv-python的findContours()方法找到各个字符的轮廓范围,然后从图片上截图下来。采用这种方案的话,我们需要尽量将图片中的噪点和线条干扰去掉,否则返回的可能就不是字符轮廓,而是一些干扰点线的轮廓。现在我们用方案二切割以下验证码图片。

 代码编写如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 读取图片
img = cv.imread("cut2.png")

# 灰度化
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 高斯模糊
img_gaussian = cv.GaussianBlur(img_gray, (1, 1), 0)

# 二值化
ret, img_threshold = cv.threshold(img_gaussian, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)

# 腐蚀处理
kernel = np.ones((1, 1), np.float32)
img_erode = cv.erode(img_threshold, kernel)

# 寻找字符轮廓并截取
cnts, hiers = cv.findContours(img_erode, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cnts = sorted(cnts, key=lambda x: cv.boundingRect(x)[0])    # 根据罗阔的x坐标从左到右排列
total_num = len(cnts)
for i, cnt in enumerate(cnts):
    x, y, w, h = cv.boundingRect(cnt)
    roi = img_erode[y:y+h, x:x+w]
    plt.subplot(1, total_num, i+1)
    plt.imshow(roi, cmap="gray")
plt.show()

运行结果如下:

 

方案三:聚类算法

通过聚类算法将各个字符分组,这种方案的稳定性不高,但有时候能够带来很大的惊喜。我们来看下这张验证码图片。

很明显不能对其进行均等分割操作,寻找轮廓的话会返回0、D、KJ这三个轮廓,而不是0、D、K、J。

注:可以将0、D、KJ这三个轮廓合并起来,然后再均分成4块。这是新的一种方案,可以有效解决自负粘连问题,不过各字符字体大小不同的话,效果就不怎么好了。

 

我们尝试用聚类算法分割下这种验证码,代码编写如下。

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 读取图片
img = cv.imread("cut3.png")

# 灰度化
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 高斯模糊
img_gaussian = cv.GaussianBlur(img_gray, (5, 5), 0)

# 二值化
ret, img_threshold = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)

# 腐蚀处理
kernel = np.ones((3, 3), np.float32)
img_erode = cv.erode(img_threshold, kernel)

# 用聚类算法切割
data = []
rows, cols = img_erode.shape
for i in range(rows):
    for j in range(cols):
        if img_erode[i, j] == 255:
            data.append((i, j))

data = np.array(data)
model = KMeans(n_clusters=4)
model.fit(data)
print(sorted(model.cluster_centers_[:, 1]))  # 从小到大打印出各个聚类中心点的x坐标

plt.scatter(data[:, 1], data[:, 0], c=model.labels_, cmap="brg")
ax = plt.gca()
ax.xaxis.set_ticks_position('top')
ax.invert_yaxis()
plt.show()

运行结果如下:

各个聚类中心点的x坐标显示如下:

有了这几个中心点的坐标,我们就可以成功截取各个字符。

方案四:垂直投影法

垂直投影法就是将图像上各列符合条件的点都下沉到图片底部,符合条件的点越多,那堆起来的高度也就越高。正常来说,在一个字符的两边,符合条件的点会比字符中间的点要少一些,通过这个原理我们就大概可以知道字符边界了。我们试着用垂直投影法分割以下验证码。

编写代码如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 读取图片
img = cv.imread("cut3.png")

# 灰度化
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 高斯模糊
img_gaussian = cv.GaussianBlur(img_gray, (5, 5), 0)

# 二值化
ret, img_threshold = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)

# 腐蚀处理
kernel = np.ones((3, 3), np.float32)
img_erode = cv.erode(img_threshold, kernel)

# 使用垂直投影法
rows, cols = img_erode.shape
data = []
for i in range(cols):
    data.append(0)
    for j in range(rows):
        if img_erode[j, i] == 255:
            data[i] += 1

for i in range(cols):
    plt.bar(i, data[i], color="black")
plt.show()

运行结果如下:

横坐标的值表示图像某一列的x坐标,纵坐标表示该列上符合条件的点。从这个柱状图中我们可以明显看到切割点,在程序中我们可以循环各个x坐标,并比较其两边的值来判断该x坐标是否是我们要找的目标点。

 

源码下载

链接:https://pan.baidu.com/s/1PQfevSMvvN8d_vDeN_5hGw  

密码:1cj4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411990.html

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

相关文章

JS Hook 基本使用

前言 Hook技术也叫钩子函数,功能是把网站的代码拉出来,改成我们自己想执行的代码片段,简单来说就是可以控制执行函数的入参和出参; 一、资源下载 编程猫插件:https://pan.baidu.com/s/1SP8xHoDpugssFRpu-nLxPw?pwdz…

ARM 编译器 Arm Compiler for Embedded 6 相关工具链简介

目录 1, Introduction to Arm Compiler 6 1.1 armclang 1.2 armasm 1.3 armlink 1.4 armar 1.5 fromelf 1.6 Arm C libraries 1.7 Arm C libraries 1,8 Application development ,ARM程序开发流程 2,ARM 编译器 5和ARM 编译器 6的兼容性 3&…

Opencv项目实战:22 物体颜色识别并框选

目录 0、项目介绍 1、效果展示 2、项目搭建 3、项目代码展示与部分讲解 Color_trackbar.py bgr_detector.py test.py 4、项目资源 5、项目总结 0、项目介绍 本次项目要完成的是对物体颜色的识别并框选,有如下功能: (1)…

【权限提升】Linux Sudo权限提升漏洞(CVE-2023-22809)

文章目录前言一、Sudo介绍二、漏洞概述三、漏洞成因四、漏洞分析五、影响版本六、本地复现七、修复建议前言 Sudo存在权限提升漏洞,攻击者可过特定的payload获取服务器ROOT权限 一、Sudo介绍 sudo (su " do")允许系统管理员将权限委托给某些用户(或用户组),能够以…

网络安全与防御

1. 什么是IDS? IDS(入侵检测系统):入侵检测是防火墙的合理补充,帮助系统对付网络攻击,扩展了系统管理员的安全管理能力,提高了信息安全基础结构的完整性。主要针对防火墙涉及不到的部分进行检测。 入侵检测主要面对的…

ChatGPT技术原理、研究框架,应用实践及发展趋势(附166份报告)

​ 一、AI框架重要性日益突显,框架技术发展进入繁荣期,国内AI框架技术加速发展: 1、AI框架作为衔接数据和模型的重要桥梁,发展进入繁荣期,国内外框架功能及性能加速迭代; 2、Pytorch、Tensorflow占据AI框…

5.2 中心极限定理

学习目标: 要学习中心极限定理,我会采取以下几个步骤: 学习基本概念:了解什么是随机变量、样本、总体、概率密度函数等基本概念,为学习中心极限定理打下基础;学习正态分布:中心极限定理的核心…

【JavaEE】计算机组成以及操作系统(进程)的基本知识

目录 前言 1、计算机基本组成 1.1、存储器 2、操作系统 2.1、 进程(任务)的概念 2.2、进程的管理 2.2.1、进程控制块PCB(process control block) 2.3、CPU分配(进程调度) 2.3.1、并发 2.3.2、并…

string容器

1、string的构造和赋值 #include #include using namespace std; void test01() { string str1(“hello world”); //使用字符串初始化 cout<<str1<<endl; string str2(5,‘A’); //使用 n 个字符串是初始化 cout<<str2<<endl; string str3 str2; …

深度学习数据集—水果数据集大合集

近期整理的各类水果&#xff08;包括干果&#xff09;数据集&#xff0c;分享给大家。 1、8类水果图片数据集&#xff08;每类100张图片左右&#xff09;[橘子&#xff0c;菠萝&#xff0c;苹果&#xff0c;木瓜&#xff0c;火龙果&#xff0c;香蕉&#xff0c;樱桃&#xff0…

系统升级 | RK3568开发平台成功搭载SylixOS国产实时操作系统

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

【GPT4】微软 GPT-4 测试报告(5)与外界环境的交互能力

欢迎关注【youcans的AGI学习笔记】原创作品 微软 GPT-4 测试报告&#xff08;1&#xff09;总体介绍 微软 GPT-4 测试报告&#xff08;2&#xff09;多模态与跨学科能力 微软 GPT-4 测试报告&#xff08;3&#xff09;编程能力 微软 GPT-4 测试报告&#xff08;4&#xff09;数…

被裁了,39 岁阿里 P9,攒下 1.5 亿....

今天刷知乎&#xff0c;在问题 “40 岁因为财务自由决定不上班的人&#xff0c;个人资产总和到底有多少” 下看到一位阿里 P9 的匿名回答让我狠狠的酸了一把~ 这刚刚失业的四十岁高级码农自曝了自己的人生经历&#xff0c;作为一名“阿里 P9”的程序员&#xff0c;他讲述了自己…

重庆理工大学教授程平:智能会计时代,应充分发挥数据资产的价值

近日&#xff0c;由用友主办的「智能会计 价值财务」2023企业数智化财务创新峰会北京站在北京国家会计学院圆满举办&#xff01;来自知名院校的专家学者、央国企等大型企业财务领路人、以及权威财经媒体相约北京国家会计学院&#xff0c;一同见证“智能会计”新时代的到来&…

centos 搭建 wiki

需要安装软件 mysqlmm-wikinginx&#xff08;非必须&#xff09; mysql 1.查询本机是否安装mysql rpm -qa | grep mysql 如安装&#xff0c;知道mysql账号密码&#xff0c;可以直接使用&#xff0c;跳过此步骤 如已安装&#xff08;centos可能默认已安装mysql或者之前有人…

day13_oop

今日内容 零、 复习昨日 一、final 二、static 三、多态 四、向上转型&向下转型 五、多态应用 零、 复习昨日 封装 类的封装: 1 属性私有 2提供setget 继承 A extends B子类可以使用父类非私有属性和方法好处: 复用,多态准备 重写/覆写/覆盖/Override 子类重写父类的方法,以…

什么是雪花算法?啥原理?

1、SnowFlake核心思想 SnowFlake 算法&#xff0c;是 Twitter 开源的分布式 ID 生成算法。 其核心思想就是&#xff1a;使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛&#xff0c;且 ID 引入了时间戳&#xff0c;基本上保持自增的&#xf…

关于ChatGPT人工智能浅谈

ChatGPT人工智能优点与不足 现今ChatGPT已经向我们展示了其强大的数据收集分析和处理能力&#xff0c;这点随着其不断的学习训练会越来越强。ChatGPT这类生成式人工智能在数据收集分析和处理能力这方面远远超过人类&#xff0c;虽然它目前还不能完全做到按人类的方式对数据进行…

常见的HTTP状态码及其含义

© Ptw-cwl HTTP是一种用于传输超文本数据的协议&#xff0c;在使用Java进行Web开发时&#xff0c;经常会涉及到HTTP状态码。以下是一些常见的HTTP状态码及其含义 概览 状态码含义1xx 信息性状态码指示请求已经被接受或者正在进行处理。100 Continue表示客户端可以继续发…

4月了,准备跳槽的可以看看

金三已经过去了&#xff0c;银四对于想跳槽的职场人来说&#xff0c;绝对要从现在开始做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也出来了。 所以准备4月跳槽、找工作的朋友&#xff0c;就一定要好好准备抓住机会&#xff0c;补一补自己的知识体系&…