《我的眼睛--图灵识别》第十章:实战演练:文字类识别

2023-11-05

《我的眼睛–图灵识别》第十章:实战演练:文字类识别

1、标准数字

标准数字(Standard Numbers)是指10个数字使用的都是同属一种字体,它们的数字没有发生变形、没有扭曲、没有错位、存在有些变色但影响不大,字与字之间的间隔距离一样,同在一个水平对齐位置上,是非常标准且正规排列的验证图形码。

在这里插入图片描述
标准数字

当你看到了这个验证图形码时,应该就能很清楚的明白前面所描述的样子了。那么,要识别这个验证图形码就需要以下的几个步骤:

在这里插入图片描述
识别步骤

第1步,特征分析

开始时一定要收集稍微多一些的验证图形码图片,且其中必须包含了所有的数字,然后从中进行比较分析,看看有什么特征对识别是有用处的全部把它找出来。
我通常的做法就是把一堆的验证图形码放在一起整齐的排列,使用的是Photoshop工具把它们拼到一张图中(详情查阅:02开发环境和工具->Photoshop7),没有玩过Photoshop图像处理工具的也可以用其他同类软件来代替。

在这里插入图片描述
整齐排列

这样排列在一起就能够很容易的进行查看与分析。经过了眼睛对图像的获取与脑袋对图像数据计算的相互理解沟通后,现在来看一看通过分析得到的3个明显的识别特征:

在这里插入图片描述
(特征1)四位数,存在0到9的十个数字

在这里插入图片描述
(特征2)数字没有发生变形,位置固定且间距都是相等的

在这里插入图片描述
(特征3)数字颜色突出区分于背景(二值化),没有受到干扰影响

第2步,滤镜处理

像素获取
使用“鱼鱼抓点抓色”工具在屏幕上获取验证图形码的截图范围左上角坐标和右下角坐标。(详情查阅:02开发环境和工具->鱼鱼抓点抓色)

在这里插入图片描述
获取截图范围坐标

感谢微软提供了很多很方便的API函数,这里使用微软提供的截取屏幕图片API(Application Programming Interface:应用程序编程接口)的BitBlt和GetDIBits等函数。
之后,根据验证图形码的屏幕截图范围坐标进行图像数据的像素获取。(详情查阅:04基础:图片识别->像素获取)

在这里插入图片描述
(预览)图像数据

二值化
利用前面分析到的第3个特征“数字颜色突出明显区分于背景,没有受到干扰影响”进行二值化处理。只要根据颜色RGB分量值的平均值判断(阈值判断:大于等于140时为黑色,否则为白色),就能很容易得到与背景区分的二值化字符图像。(详情查阅:07预处理:图像滤镜->彩色图像滤镜->二值化)

在这里插入图片描述
二值化图像

当颜色RGB分量值的总和除以3,大于等于预设置的阈值140时,等于黑色(16进制:000000,10进制:0),否则等于白色(16进制:FFFFFF,10进制:16777215),即为二值化。种类不同的验证图形码,它们在二值化算法中的阈值大小设置也都是不一样的,根据实际情况再进行设置阈值的大小。
接下来要简单的提一下什么是颜色?
所谓颜色,其实就是由红(Red),绿(Green)和蓝(Blue)三原色组合而成的。

在这里插入图片描述
(RGB)三原色

颜色三原色分量简称:红色(R),绿色(G),蓝色(B)。取值范围都是:0~255,比如:(R=0,G=0,B=0)组合出来的就是黑色,(R=255,G=255,B=255)组合出来的就是白色。

第3步,切割图像

字符切割
利用前面分析到的第2个特征“数字没有发生变形,位置固定且间距都是相等的”进行字符的切割。得到起点位置坐标、数字宽高、字间距和文字数量,使用“切割_固定位置()”函数的切割方法进行切割,最终得到10个数字独立的字符图像数据。(详情查阅:08训练:图像字符切割->固定位置)

在这里插入图片描述
固定位置切割

在这里插入图片描述
(预览)10个字符图像数据

生成识别库
识别字库数据使用二进制的数字0和1来表示(也可以用其他字符来代替,如:a和b,但是这样体现黑白色就不直观了),黑色的就用数字0来代表,白色的用数字1来代表,生成出来的点阵识别字库就是一串看起来很像二进制码的字符串。(详情查阅:09训练:制作识别字库->生成字库)
完成点阵识别字库之后,需要对其加入该点阵识别字库所对应的文字、宽和高的数据进行保存到“识别库.lib”文件中。(详情查阅:09训练:制作识别字库->存储结构)

在这里插入图片描述
(记事本)识别库内容

第4步,文字识别

加载识别库
读取识别字库“识别库.lib”文件进行数据内容的加载,解析加载的数据内容并保存到变量“字库”的一维数组结构体中,这样“字库”中就会存储有10个数字的文字,宽,高和点阵的数据内容。(详情查阅:09训练:制作识别字库->使用字库)

在这里插入图片描述
“字库”一维数组

点阵比对
根据切割字符得到的字符图像数据与一维数组“字库”的数据内容第一个点阵识别字库的二进制数字开始进行一对一比较判断是否相等或不等,如果相等则会记录相等的数量,用于之后计算点数匹配的相似度。(详情查阅:06基础:验证图形码识别->什么是相似度)

在这里插入图片描述
(左:字符图像数据,右:点阵识别字库)一对一比较

直到完成该字符图像数据与所有字库的点阵比对,算出该字符图像数据分别对应字库的相似度百分比,并对其相似度进行大小排序,得到该字符图像数据所对应的字库中相似度最高的文字。

在这里插入图片描述
字符图像数据

在这里插入图片描述
数字8的比对结果

重复以上步骤,对其它的3个字符图像数据继续进行点阵比对,最终完成验证图形码上4位数字的识别。

在这里插入图片描述
数字2的比对结果

在这里插入图片描述
数字0的比对结果

在这里插入图片描述
数字1的比对结果

VB6代码:
调用例子:

Dim 图像数据() As Byte
Dim 起点X As Long, 起点Y As Long, 字宽 As Long, 字高 As Long, 字间距 As Long, 字数 As Long
Dim 切割字符() As 切割类型, 字库() As 字库类型
Dim 识别文字 As String, 文字 As String, i As Long
'1.获取
Call 来源_获取图片像素("C:\8201.bmp", 图像数据)
'2.滤镜
Call 滤镜_二值化(图像数据, 140, 图像数据)
起点X = 6
起点Y = 4
字宽 = 7
字高 = 11
字间距 = 13
字数 = 4
'3.切割
Call 切割_固定位置(图像数据, 起点X, 起点Y, 字宽, 字高, 字间距, 字数, 切割字符)
'4.字库
Call 字库_读取识别字库("C:\识别库.lib", 字库)
'5.识别
文字 = ""
For i = 0 To 字数 - 1
    Call 点阵比对(切割字符(i).点阵, 切割字符(i).宽, 切割字符(i).高, 字库, 识别文字)
    文字 = 文字 & 识别文字
Next
MsgBox 文字

封装函数:

Public Type 识别类型
    相似度 As Long
    '百分比 As Long
    文字 As String
End Type

Public Sub 点阵比对(图像点阵 As String, 字宽 As Long, 字高 As Long, 字库数据() As 字库类型, 返回识别文字 As String)
Dim w As Long, h As Long,As Long,As Long, n As Long, m As Long
Dim 识别数据() As 识别类型, i As Long, 数量 As Long, 相似点 As Long
    数量 = UBound(字库数据)
    ReDim 识别数据(数量) As 识别类型
    For i = 0 To 数量
        宽 = 字库数据(i).宽
        高 = 字库数据(i).高
        识别数据(i).文字 = 字库数据(i).文字
        n = 0
        m = 0
        相似点 = 0
        For w = 0 ToIf w > 字宽 Then Exit For    '为数据越界处理
            For h = 0 ToIf h > 字高 Then Exit For    '为数据越界处理
                If Mid(图像点阵, 1 + n, 1) = Mid(字库数据(i).点阵, 1 + m, 1) Then    '一对一比较
                    相似点 = 相似点 + 1
                End If
            Next
            n = n + 字高 - 1
            m = m + 字高 - 1
        Next
        识别数据(i).相似度 = 相似点
        '识别数据(i).百分比 = 相似点 / ((宽 + 1) * (高 + 1)) * 100
    Next
    Call 相似度排序(识别数据, 0, 数量)
    返回识别文字 = 识别数据(数量).文字
End Sub

按键精灵2014脚本:
调用例子:

Call Plugin.TULING.Pixel_FromPicture("C:\8201.bmp")
Call Plugin.TULING.Filter_Binaryzation("140-255")    //二值化
//显示获取的图像
Call Plugin.TULING.Pixel_Preview()
数量 = Plugin.TULING.Incise_FixedLocation(6, 4, 7, 11, 13, 4)    //固定位置切割
数量 = Plugin.TULING.Lib_Load("C:\识别库.lib")
TracePrint Plugin.TULING.OCR()

未完待续……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《我的眼睛--图灵识别》第十章:实战演练:文字类识别 的相关文章

随机推荐

  • VUE+Element UI 展示json数据 [vue-json-viewer]

    1 安装组件vue json viewer npm install vue json viewer save 2 在main js中引入并使用vue json viewer import JsonViewer from vue json v
  • linux下安装git-lfs的两种方法

    一 方法一 推荐 首先安装git lfs ubuntu版 sudo apt get install git lfs centeros版 sudo yum install git lfs 然后验证安装成功 git lfs install 若显
  • 电商平台学习笔记(四)——Spring配置Mybatis简化DAO层省略Mybatis核心配置文件

    今天看到电商视频教程第三天的时候 惊奇的发现 这个电商平台一共有16张表 加上MyBatis的模板Bean 一共32个Bean 如下图 想到这里 如果有Mybatis的核心配置文件 mybatis config xml 仅对每一JavaBe
  • Java中匿名内部类

    含义 由于Java中接口和抽象类都不能实例化对象 故使用接口或抽象类时 必须有一个实现类 对应接口 或继承类 对应抽象类 而该实现类或继承类的对象被使用次数很少 不值得去专门编码时候 就可以使用匿名内部类 此时该类不必命名 并且对象只被创建
  • 4.7、漏洞利用-SMTP

    目录 4 7 漏洞利用 SMTP 1 SMTP环境搭建 1 1 邮件发送和接收模型 1 2 添加主机名和域名 1 3 Ubuntu下安装postfix 1 4 安装dovcot 2 利用搭建环境发送和接收邮件 3 枚举smtp用户名 3 2
  • secure注册码&许可向导

    secure许可向导搜了半天也没找到能用的 搜注册码一搜就搜到了 Name meisi Company TEAM ZWT Serial Number 03 14 367662 License Key ACCFAX R9FHJ7 QZVS2P
  • 适合零基础学习的IT编程技术

    现在很多应届生 不管是否是计算机专业 都想毕业后从事IT行业 不仅是因为IT行业的薪资高 更主要是IT行业就业需求多 发展好 工作稳定 学IT 技术在手 天下我走 当然 IT行业有很多学科方向 学习哪个方向很重要 选择方向这件事 有时候就是
  • Lenet5实现及代码详解——以MINST数据集为例

    看了卷积神经网络 CNN 的原理及介绍 想着自己动手解决一个案例 在网上也看了很多博客 这里整理一下 顺便记录一下自己解决一个完成的CNN实例的过程 以便以后方便看 如果有不足之处 欢迎大家指正 数据获取与可视化操作 1 下载minst数据
  • Android Audio系统框架

    Audio System 二 之 Audio系统框架 二 Linux Audio系统框架 2 1 Application 层 2 2 Framework 层 2 3 Libraries 层 2 4 HAL 层 2 5 Tinyalsa 层
  • vue3 Failed to resolve component router-view

    Failed to resolve component router view If this is a native custom element make sure to exclude it from component resolu
  • unity常用核心类

    Transform 变换 主要用于控制物体的旋转 移动 缩放 Rotate eulerAngles Vector3 relativeTo Space Space Self void 旋转 游戏对象围绕Y轴旋转 transform Rotat
  • JqGrid实现分页相关

    jqGrid默认就提供了分页的功能 其在实现分页的时候有两个隐含的属性与后台交互及page 当前页 rows 每页显示的数据量 当请求下一页的时候请求数据头部默认包含这两个属性 如图 Page和rows传到后台 后台接收 要实现分页后台必须
  • unity 获取场景所有物体

    转载的 Unity 遍历场景所有物体 包括隐藏及被禁用的物体 用于获取所有Hierarchy中的物体 包括被禁用的物体 private List
  • mysql增加用户

    mysql增加用户 增加用户 注意 和上面不同 下面的因为是MYSQL环境中的命令 所以后面都带一个分号作为命令结束符 格式 grant select on 数据库 to 用户名 登录主机 identified by 密码 第一种 增加一个
  • CM5501高效四开关降压-升压控制器(升降压芯片)

    CM5501 High Efficiency 4 Switch Buck Boost Controller Description CM5501 is a synchronous 4 switch Buck Boost controller
  • elasticsearch-索引与分片实现原理

    添加索引 我们往 Elasticsearch 添加数据时需要用到 索引 保存相关数据的地方 索引实际上是指向一个或者多个物理 分片 的逻辑命名空间 一个 分片 是一个底层的 工作单元 它仅保存了全部数据中的一部分 在分片内部机制中 我们将详
  • InheritableThreadLocal类详解

    我们在使用ThreadLocal类的时候 可以保证各个线程使用自己的数据 而不相互干扰 但是如果我们有这样的一个需求 就是各个线程相互不干扰的情况下 各个线程的子线程可以访问到当前线程中的值 对于这个子线程来说就是访问父线程 public
  • Scrum那些事 - 什么是Scrum?

    1 什么是Scrum Scrum是敏捷开发方法论里面的一个具体实施框架 Scrum是一个包括了一系列的实践和预定义角色的过程骨架 是一种流程 计划 模式 用于有效率地开发软件 Scrum的框架中包含3种角色 3个产出 5个活动和5种价值观
  • 1.业务层 、服务层、数据层、表现层

    一般说来 业务逻辑层中的模块包含了系统所需要的所有功能上的算法和计算过程 并与数据访问层和表现层交互 抽象的说 业务逻辑层就是处理与业务相关的部分 一般来说 业务层包含一系列的执行与数据的操作 例如 开具发票 添加客户或下订单等 服务层就是
  • 《我的眼睛--图灵识别》第十章:实战演练:文字类识别

    我的眼睛 图灵识别 第十章 实战演练 文字类识别 1 标准数字 标准数字 Standard Numbers 是指10个数字使用的都是同属一种字体 它们的数字没有发生变形 没有扭曲 没有错位 存在有些变色但影响不大 字与字之间的间隔距离一样