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

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(使用前将#替换为@)

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

  • Mask-RCNN应用 - 批量生成训练所需文件并训练自己的数据集(技巧与防坑)

    MaskRCNN入门路径 gt Mask RCNN应用研究方法 持续更新中 如有问题或需要指导 请私聊留下联系方式用手机打开https m tb cn h fINaraE tk PCzA2jPp4V0进行咨询 本文介绍标注数据和训练过程并提
  • Open mv识别三角形的办法

    文章目录 前言 带着问题来看 一 函数 二 使用方法 1 find line segments 2 img find template 三 摄像情况及终端结果 1 find line segments 2 img find template
  • Lenet5实现及代码详解——以MINST数据集为例

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

    随着工业化的发展 森林 湿地等生态系统逐步被开发 如何保护鸟类日益成为人们关注的话题 针对自然保护地鸟类监测面临的种类繁多 相似度高 活动范围大等痛点 快瞳科技研发上线的鸟类识别算法便致力于解决以上痛点 借助AI赋能助力生物多样性保护 快瞳
  • python实现手势识别

    python实现手势识别 入门 使用open cv实现简单的手势识别 刚刚接触python不久 看到了很多有意思的项目 尤其时关于计算机视觉的 网上搜到了一些关于手势处理的实验 我在这儿简单的实现一下 PS 和那些大佬比起来真的是差远了 毕
  • 【图像处理】阈值分割

    图像阈值分割 一 简介 阈值分割常用在灰度图像中 将灰度值以一定的阈值进行分割 分为0或者255 使图像的像素值只有0或者255 非黑即白 由于不同物体的像素值不同 根据设置的阈值 将图像中的物体以像素级分割出来 有利于图像的进一步处理 使
  • 计算机视觉系列-2-图像分类

    给定一张输入图像 图像分类的任务是判断该图像属于哪类 如果是多任务分类 可以用于分类该图像包含哪个类别 深度学习作为机器学习中非常重要的分支 在图像领域中应用非常广泛 在图像分类任务中 通常采用卷积层 CNN 提取特征 加上全连接层进行分类
  • python实现车牌识别系统

    车牌识别系统 算法参考 http www zengqiang club blog 34 GUI参考 https blog csdn net wzh191920 article details 79589506 基于opencv的模板识别来实
  • OpenCV三维图像的创建和数据遍历

    创建一个如图所示的3 X 4 X 6 三维矩阵 include
  • 虚拟现实下的手势识别综述

    虚拟现实下的手势识别综述 目录 虚拟现实下的手势识别综述 摘要 关键词 1 引言 2 国内外研究现状 3 手势识别的关键技术 3 1手势分割 3 2手势建模 3 3手势识别 3 4特征提取 4 存在的问题及发展趋势 5 结论 参考文献 摘要
  • opencv +数字识别

    现在很多场景需要使用的数字识别 比如银行卡识别 以及车牌识别等 在AI领域有很多图像识别算法 大多是居于opencv 或者谷歌开源的tesseract 识别 由于公司业务需要 需要开发一个客户端程序 同时需要在xp这种老古董的机子上运行 故
  • VGGNet实现CIFAR-100图像识别-1(数据预处理,one-hot)

    VGGNet CIFAR 100 导入数据 数据预处理 方法1 方法2 可能会遇到的问题 解决办法 Normalization和拆分训练集 验证集 One hot编码 未完待续 接下来请看另一篇博文 VGGNet实现CIFAR 100图像识
  • CnOCR 使用教程

    目录 一 简介 二 使用教程 三 效果展示 一 简介 CnOCR 是 Python 3 下的文字识别 Optical Character Recognition 简称OCR 工具包 支持简体中文 繁体中文 部分模型 英文和数字的常见字符识别
  • 基于卷积的图像分类识别(六):DenseNet & FractalNet

    系列文章目录 本专栏介绍基于深度学习进行图像识别的经典和前沿模型 将持续更新 包括不仅限于 AlexNet ZFNet VGG GoogLeNet ResNet DenseNet SENet MobileNet ShuffleNet Eif
  • yolo 车辆测距+车辆识别+单目测距(双目测距)

    基于yolo目标检测算法实现的车前道路中的车辆和行人检测 并且可以估测出目标与本车之间的距离 一 视频展示 yolo车距1 订阅专栏获得源码 提供完整代码 无需看下文 二 单目测距原理 图中有一个车辆 且车辆在地面上 其接地点Q必定在地面上
  • 【图像识别】图像特征、特征检测、特征提取

    目录 1 图像特征 2 特征检测与特征提取 2 1 特征检测算法 2 2 1Moravec 2 1 2 Harris 2 1 3 FAST 2 1 4 SIFT 2 1 5 SURF 2 1 6 BRIRF 2 1 7 ORB 2 2 特征
  • 关于图像模式识别的几种分类方法概述

    1 基于概率统计的Bayes分类器 因为在实际分类中由于考虑的侧重点不同或者关心的点不一样导致不能使用同一决策去解决所有的事件的分类 所以需要根据不同的准测函数选择不同的分类决策 基于最小错误率的Bayes决策 基于最小风险的Bayes决策
  • 【Mo 人工智能技术博客】图卷积网络概述及其在论文分类上的应用

    近年来 深度学习在计算机视觉 自然语言处理等领域大放异彩 这些领域所面对的数据都是结构化的 如图像 音频 文本等 它们内部都有明确的排列规则 结构化的数据由于具有这些确定的规则而方便处理 但是在现实生活中 非结构化的关系数据才是主流 我们无
  • yolo 车辆测距+车辆识别+单目测距(双目测距)

    基于yolo目标检测算法实现的车前道路中的车辆和行人检测 并且可以估测出目标与本车之间的距离 一 视频展示 yolo车距1 订阅专栏获得源码 提供完整代码 无需看下文 二 单目测距原理 图中有一个车辆 且车辆在地面上 其接地点Q必定在地面上
  • 用MATLAB实现人脸识别

    1 人脸识别技术的细节 一般来说 人脸识别系统包括图像提取 人脸定位 图形预处理 以及人脸识别 身份确认或者身份查找 系统输入一般是一张或者一系列含有未确定身份的人脸图像 以及人脸数据库中的若干已知身份的人脸图像或者相应的编码 而其输出则是

随机推荐

  • 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个数字使用的都是同属一种字体 它们的数字没有发生变形 没有扭曲 没有错位 存在有些变色但影响不大 字与字之间的间隔距离一样