图像数字识别、数字分割(OCR识别,毕业设计)

2023-10-28

基本图像处理流程

这是我在测试图像处理中使用的原始图像。它有一些眩光点,但是图像相当干净。让我们逐步完成获取此源图像的过程,并尝试将其分解为单个数字。

在这里插入图片描述

影像准备

在开始图像处理流程之前,我们决定先调整一些图像属性,然后再继续。这有点试验和错误,但注意到,当我们调整图像的曝光度时,可以获得更好的结果。下面是使用Python调整后的图像,相当于曝光(阿尔法)的图像cv::Mat::convertTo这是刚刚在图像垫乘法操作cv2.multiply(some_img, np.array([some_alpha]),调整曝光。
在这里插入图片描述

灰度图

将图像转换为灰度
在这里插入图片描述

模糊

cv2.GaussBlur模糊图像以减少噪点。我们尝试了许多不同的模糊选项,但仅用轻微的模糊就找到了最佳结果。

阈值分割

在下图中,使用cv2.adaptiveThreshold带有cv2.ADAPTIVE_THRES_GAUSSIAN_C选项的方法。此方法采用两个参数,块大小和要调整的常数。
在这里插入图片描述

填补空白

由于大多数燃油泵都使用某种7段LCD显示屏,因此数字中存在一些细微的间隙,无法使用轮廓绘制方法,因此我们需要使这些段看起来相连。在这种情况下,我们将转到cv2.erode图像来弥补这些差距。使用cv2.dilate将其膨胀,但是这些方法通常适用于图像的白色部分。在我们的案例中,我们正在“侵蚀”白色背景以使数字看起来更大。
在这里插入图片描述

反转图像

在尝试在图像中查找轮廓之前,我们需要反转颜色,因为cv2.findContours方法将找到白色的连接部分,而当前的数字是黑色。
在这里插入图片描述

在图像上找到轮廓

下图显示了我们的原始图像,该图像在上图的每个轮廓上都有包围框。大家可以看到它找到了数字,但也找到了一堆不是数字的东西,因此我们需要将它们过滤掉。
在这里插入图片描述

轮廓过滤

1.现在我们有了许多轮廓,我们需要找出我们关心的轮廓。浏览了一堆气泵的显示和场景后,使用一套适用于轮廓的快速规则。

2.收集所有我们将分类为潜在小数的正方形轮廓。

3.扔掉任何不是正方形或高矩形的东西。

4.使轮廓与某些长宽比匹配。LCD显示屏中的十个数字中有九个数字的长宽比类似于下面的蓝色框高光之一。该规则的例外是数字“ 1”,其长宽比略有不同。通过使用一些样本轮廓,我将0–9!1方面确定为0.6,将1方面确定为0.3。它将使用这些比率和+/-缓冲区来确定轮廓是否是我们想要的东西,并收集这些轮廓。

5.对潜在数字应用一组附加规则,在这里我们将确定轮廓边界是否偏离所有其他潜在数字的平均高度或垂直位置。由于数字的大小应相同,并且在相同的Y上对齐,因此我们可以丢弃它认为是数字的任何轮廓,但不能像其他轮廓那样将其对齐和调整大小,
在这里插入图片描述

预测

有两个等高线轮廓,一个带潜在位数,一个带潜在小数位,我们可以使用这些轮廓边界裁剪图像,并将其输入经过训练的系统中以预测其值。有关此过程的更多信息,请参见“数字训练”部分。

查找小数

在图像中查找小数点是要解决的另一个问题。由于它很小,有时会连接到它旁边的手指,因此使用我们在手指上使用的方法来确定它似乎有问题。当我们过滤轮廓时,我们收集了可能是十进制的正方形轮廓。从上一步获得经过验证的数字轮廓之后,我们将找到数字的最左x位置和最右x位置,以确定我们期望的小数位数。然后,我们将遍历那些潜在的小数,确定它是否在该空间以及该空间的下半部分,并将其分类为小数。找到小数点后,我们可以将其插入到我们上面预测的数字字符串中。
在这里插入图片描述

数字训练

在机器学习的世界中,解决OCR问题是一个分类问题。我们建立了一组训练有素的数据,例如图像处理中的数字,将它们分类为某种东西,然后使用该数据来匹配任何新图像。一旦基本的图像隔离功能开始工作,我就创建了一个脚本,该脚本可以遍历图像文件夹,运行数字隔离代码,然后将裁剪的数字保存到新文件夹中供我查看。运行完之后,我会有一个未经训练的数字文件夹,然后可以用来训练系统
在这里插入图片描述
由于OpenCV已经包含了k近邻(k-NN)实现,因此无需引入任何其他库。为了进行训练,我们浏览了数字作物的文件夹,然后将其放入标有0–9的新文件夹中,因此每个文件夹中都有一个数字的不同版本的集合。我们没有大量的这些图像,但是有足够的证据来证明这是可行的。由于这些数字是相当标准的,我认为我不需要大量训练有素的图像就可以相当准确。

k-NN工作原理的基础是,我们将以黑白方式加载每个图像,将该图像存储在每个像素处于打开或关闭状态的数组中,然后将这些打开/关闭像素与特定的数字相关联。然后,当我们要预测一个新图像时,它将找出哪个训练图像与这些像素最匹配,然后向我们返回最接近的值。

整理好数字后,将创建一个新的脚本,该脚本将遍历这些文件夹,获取每个图像并将该图像与数字关联。到目前为止,在大多数代码中,一般的图像处理概念在Python和C ++中都应用相同,但是在这里会有细微的差别。

优化

一旦确定了数字隔离和预测的两个目标,就需要对算法进行优化,以预测泵的新图像上的数字。

在优化的初始阶段,创建了一个简单的Playground应用程序,其中使用了OpenCV提供的一些简单的UI组件。使用这些组件,可以创建一些简单的轨迹栏,以左右滑动并更改不同的值并重新处理图像。围绕该cv2.imshow方法创建了一个小包装程序,该方法可以平铺显示的窗口,因为我讨厌总是重新放置它们。
在这里插入图片描述
我们可以加载不同的图像,并在图像处理中尝试变量的不同变化,并确定最佳的组合。

代码获取请私信

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

图像数字识别、数字分割(OCR识别,毕业设计) 的相关文章

  • 根据另一个数据框中找到的范围填充数据框中的列

    我试图根据该记录的索引值是否落在另一个数据框中的两列定义的范围内来填充数据框中的列 df1 看起来像 a 0 4 1 45 2 7 3 5 4 48 5 44 6 22 7 89 8 45 9 44 10 23 df2 是 START ST
  • Pandas 在列级别连接数据帧时添加键

    根据 Pandas 0 19 2 文档 我可以提供keys参数来创建结果多索引 DataFrame 一个例子 来自 pandas 文档 是 result pd concat frames keys x y z 我将如何连接数据框以便我可以在
  • 从 Python 将分层 JSON 数据写入 Excel xls?

    我想将一些数据从 python 写入 xlsx 我目前将其存储为 JSON 但它从 Python 中输出什么并不重要 单个文章的 JSON 如下所示 Word Count 50 Key Words Blah blah blah Foo Fr
  • 使用 Unity3D 解决 PnP

    我有一个真实 物理的棍子 上面连接有红外摄像头和一些红外 LED 它们形成了我正在使用的模式 以便使虚拟棍子以与物理棍子相同的方式移动 为此 我在 Python 中使用 OpenCV 并将由solvePnP 计算的旋转和平移向量发送到 Un
  • 无法使用 Python 循环分页 API 响应

    所以 我对这个感到摸不着头脑 使用 HubSpot 的 API 我需要获取我客户的 门户 帐户 中所有公司的列表 遗憾的是 标准 API 调用一次只能返回 100 家公司 当它返回响应时 它包含两个参数 使分页响应成为可能 其中之一是 ha
  • 更改 numpy 数组的结构强制给定值

    如何缩小栅格数据的比例4 X 6大小成2 X 3如果 2 2 像素内的任何元素包含 1 则大小强制选择 1 否则选择 0 import numpy as np data np array 0 0 1 1 0 0 1 0 0 1 0 0 1
  • 将相同的 Patch 实例添加到 matplotlib 中的多个子图中

    我正在尝试将补丁的相同实例添加到 matplotlib 中的多个轴 这是最小的例子 import matplotlib pyplot as mpl plt import matplotlib patches as mpl patches f
  • 从 Spark 数据帧中过滤大量 ID

    我有一个大型数据框 其格式类似于 ID Cat date 12 A 201602 14 B 201601 19 A 201608 12 F 201605 11 G 201603 我需要根据大约 500 万个 Is 的列表来过滤行 最直接的方
  • Python Tkinter 网格复选框

    我想知道是否有一种简单的方法可以使用 Tkinter 创建复选框网格 我正在尝试制作一个由 10 行和 10 列 即 100 个复选框 组成的网格 以便每行只能选择两个复选框 编辑 我正在使用带有spyder的python 2 7 到目前为
  • 如何在python中访问矩阵每个元素的相邻单元格?

    这里 如果两个单元共享边界 则它们被认为是相邻的 例如 A 5 6 4 2 1 3 7 9 8 这里 索引 0 0 的相邻元素位于索引 0 1 和 1 0 处 索引 1 1 的相邻元素位于索引 0 1 1 0 2 1 处 和 1 2 假设你
  • 在 Python 中将嵌套字典位置作为参数传递

    如果我有一个嵌套字典 我可以通过索引来获取键 如下所示 gt gt gt d a b c gt gt gt d a b c 我可以将该索引作为函数参数传递吗 def get nested value d path a b return d
  • 如何删除 pip 安装的所有软件包?

    如何从当前激活的虚拟环境中卸载 pip 安装的所有软件包 我发现这个片段作为替代解决方案 与重新创建 virtualenv 相比 删除库更加优雅 pip freeze xargs pip uninstall y 如果您通过 VCS 安装了软
  • Pandas 中的数据透视表小计

    我有以下数据 Employee Account Currency Amount Location Test 2 Basic USD 3000 Airport Test 2 Net USD 2000 Airport Test 1 Basic
  • 在 matplotlib 中将 3D 背景更改为黑色

    我在将 3D 图表的背景更改为黑色时遇到问题 这是我当前的代码 当我将facecolor设置为黑色时 它会将图表内部更改为灰色 这不是我想要的 fig plt figure fig set size inches 10 10 ax plt
  • 向结构化 numpy 数组添加字段

    将字段添加到结构化 numpy 数组的最简洁方法是什么 是否可以破坏性地完成 或者是否有必要创建一个新数组并复制现有字段 每个字段的内容是否连续存储在内存中 以便可以有效地完成此类复制 如果您使用 numpy 1 3 还有 numpy li
  • Django:显示管理员验证错误的自定义错误消息

    我正在使用 Django 1 2 4 我有一个模型 其中有一个需要验证的字段 当验证失败时 我想向用户显示自定义错误消息 模型编辑是在管理界面中完成的 这就是我目前正在做的事情 def clean fields self exclude N
  • datetime strftime 不输出正确的时间戳

    下列 gt gt gt from dateutil parser import parse gt gt gt parse 2013 07 02 00 00 00 0000 datetime datetime 2013 7 2 0 0 tzi
  • 给定一个字符串,如何删除所有重复的连续字母?

    如何从字符串中删除两个连续的字母 例如 a str hii thherre 应该成为 hi there 我尝试这样做 a str join sorted set a str key a str index 但是 我得到 hi ter 是的
  • python:xml.etree.ElementTree,删除“命名空间”

    我喜欢 ElementTree 解析 xml 的方式 特别是 Xpath 功能 我有一个带有嵌套标签的应用程序的 xml 输出 我想按名称访问此标签而不指定名称空间 这可能吗 例如 root findall molpro job 代替 ro
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整

随机推荐

  • Python学习——import用法

    import主要有以下两种用法 import 模块名1 as 别名1 模块名2 as 别名2 使用这种语法格式的 import 语句 会导入指定模块中的所有成员 包括变量 函数 类等 不仅如此 当需要使用模块中的成员时 需用该模块名 或别名
  • nocaos找不到jdk

    启动nacos找不到jdk的环境变量 查看jdk 1 8 64为位是没问题的 解决方案 打开startup cmd JAVA HOME 改成自己jdk路径 问题解决
  • 实验一 顺序表的操作(数据结构实验)

    以下为实验内容 1 实验性质 设计性实验 2 要求 编程实现顺序表的以下基本操作 建立顺序表 修改顺序表 插入顺序表 删除顺序表 采用顺序表结构编程实现 两个集合的运算 交集 并集 差集 3 实验目的 通过该实验 深入理解顺序表的逻辑结构
  • Hashcat的使用手册总结

    简介 Hashcat是自称世界上最快的密码恢复工具 它在2015年之前拥有专有代码库 但现在作为免费软件发布 适用于Linux OS X和Windows的版本可以使用基于CPU或基于GPU的变体 支持hashcat的散列算法有Microso
  • 字符设备驱动API

    字符设备驱动框架 注册字符设备 批量注册设备 int register chrdev unsigned int major const char name const struct file operations fops 功能 注册字符设
  • 云厂商降价潮背后:来中小企业战场「拼刺刀」

    如果说过往云厂商的降价打响的是从C端进军B端的营销战 那么在这一轮降价潮背后 对应的则是云厂商从大型KA客户向中小企业进军的信号 强被集成 强获客 云厂商又一轮降价潮袭来 5月16日 移动云宣布部分产品线最高降幅达60 降价政策将于 5 月
  • Python手写Bresenham画线算法(线段+射线)

    文章目录 Bresenham画线算法 根据两个顶点画线 根据端点以及角度画线 Bresenham画线算法 根据两个顶点画线 Bresenham画线算法适用于斜率绝对值小于1的情况 所以要进行翻转 k绝对值小于1的情况下将算法中的x和y换一下
  • 手写机器学习算法07——支持向量机

    引言 支持向量机 SVM Support Vector Machine 是一种分类算法 其基本思想是在样本空间中找到一个超平面 在将不同类别的样本分开的前提下 使超平面离距自己最近的样本尽可能远 如上图所示二维空间中 支持向量机算法的目标就
  • pandas中的to_datetime()方法

    注 写的比较简单 仅用于记录 1 作用 将给定的数据按照指定格式转换成日期格式 2 常用参数 arg 输入 errors 错误数据处理 format 日期格式 3 用法 案例1 给定一个时间和一个格式 给定的时间就会按照给定的格式将它转换成
  • C# 杀进程的方法

    private void KillProcess string processName 获得进程对象 以用来操作 System Diagnostics Process myproc new System Diagnostics Proces
  • Detecting Communities from Heterogeneous Graphs:A Context Path-based Graph Neural Network Model

    1 异构图如何学习节点的嵌入 传统方法 meta path meta path 根据meta path模式指导随机游走 根据生成的序列提取指定窗口范围内的元组 类似于文本skip gram模型 优化目标是这些共现元组概率最大化 缺点 1 定
  • 代码黑科技

    快读 include
  • @Valid 使用

    Valid 使用 作用 Valid注解用于校验 所属的包 javax validation Valid 而在Springboot启动器的web包已经含有该包 所以无需添加多余的依赖 你可以定义实体 在实体的属性上添加校验规则 在API接收数
  • maven命令

    目录 常用命令 命令集锦 命令介绍 常用命令 常用命令及其作用 命令 描述 mvn clean 对项目进行清理 删除target目录下编译的内容 mvn compile 编译项目源代码 mvn test 对项目进行运行测试 mvn pack
  • React hooks 对比class优势

    1 hook可以直接从组件中提取状态逻辑 无需修改组件结构复用 不用形成render props 高阶组件嵌套地狱 2 将组件关联部分设置为更小函数 订阅发布或请求数据 可根据reducer管理组件内部状态 不用像class一样根据生命周期
  • 浅谈卷积神经网络及matlab实现

    1卷积神经网络的优点 卷积神经网络进行图像分类是深度学习关于图像处理的一个应用 卷积神经网络的优点是能够直接与图像像素进行卷积 从图像像素中提取图像特征 这种处理方式更加接近人类大脑视觉系统的处理方式 另外 卷积神经网络的权值共享属性和po
  • Android译文

    http blog csdn net vanpersie 9987 article list 4 http blog csdn net qinxiandiqi article category 2394347 Android Gradle
  • c语言中的头文件string.h的作用,C语言常用头文件及库函数——string.h

    string h 函数与形参类型 函数功能 返回值 例子 1 memcmp 函数与形参类型 int memcmp buf1 buf2 count void buf1 void buf2 int count 函数功能 按字典顺序比较由buf1
  • 十个值得一试的开源深度学习框架

    十个值得一试的开源深度学习框架 oschina 发布于 2015年11月16日 28评 分享到 收藏 359 12月12日北京OSC源创会 开源技术的年终盛典 本周早些时候Google开源了TensorFlow GitHub 此举在深度学习
  • 图像数字识别、数字分割(OCR识别,毕业设计)

    基本图像处理流程 这是我在测试图像处理中使用的原始图像 它有一些眩光点 但是图像相当干净 让我们逐步完成获取此源图像的过程 并尝试将其分解为单个数字 影像准备 在开始图像处理流程之前 我们决定先调整一些图像属性 然后再继续 这有点试验和错误