Java基于opencv实现图像数字识别(二)—基本流程

做一个项目之前呢,我们应该有一个总体把握,或者是进度条;来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程。

我做的主要是表格中数字的识别,但这个不是重点。重点是通过这个我们可以举一反三,来实现我们自己的业务。

图像的识别主要分为两步:图片预处理和图像识别;这两步都很重要

图像预处理:
1、 图像灰度化;二值化
2、 图像降噪,去除干扰线
3、 图像腐蚀、膨胀处理
4、 字符分割
5、 字符归一化

图像识别:
1、 特征值提取
2、 训练
3、 测试

灰度化:

在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值;因此,灰度图像每个像素点只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般常用的是加权平均法来求像素点的灰度值

常见的加权方法如下:
1:)Gray = B ; Gray = G ; Gray = R
2:)Gray = max({B , G , R})
3:)Gray = (B + G + R) / 3
4:)Gray = 0.072169 * B + 0.715160 * G + 0.212671 * R
5:)Gray = 0.11 * B + 0.59 * G + 0.3 * R

这几种方法中,第一为分量法,即用RGB三个分量的某一个分量作为该点的灰度值;第二种方法为最大值法,将彩色图像中的三个分量亮度的最大值作为灰度图的灰度值;第三种方法是将彩色图像中的三分量求平均得到一个灰度图;后两种都属于加权平均法,其中第四种是opencv开发库所采用的一种求灰度值算法;第五种为从人体生理学角度所提出的一种求灰度值算法(人眼对绿色的敏感最高,对蓝色敏感最低)

二值化:

图像的二值化,就是将图像上的像素点的灰度值设置位0或255这两个极点,也就是将整个图像呈现出明显的只有黑和白的视觉效果

图像降噪:

就是处理掉一些干扰因素;

主要的降噪算法

滤波类:通过设计滤波器对图像进行处理。特点是速度往往比较快,很多卷积滤波可以借助快速傅里叶变化来加速

稀疏表达类:自然图片之所以看起来不同于随机噪音/人造结构,是因为大家发现他们总会在某一个横型下存在稀疏表达。而我们想排除的噪音往往无法被稀疏化。基于这个判别式模型,用稀疏性来约束自然图像,在很多逆问题里取得了拔群的效果

外部先验:如果从有噪音的图片本身无法找到规律,我们也可以借助其他类似但又没有噪音的图片,来总结图片具有的固有属性。这一类方法利用的外部图片来创造先验条件,然后用于约束需要预测的图片。最有代表性就是混合高斯模型

聚类低秩:除了可稀疏性,低秩性也是自然图片常见的一个特性。数学上,可稀疏表达的数据可以被认为是在Union of low-dimensional subspaces;而低秩数据则是直接存在于一个Low-dimensional subspace。这个更严格的限制往往也可以取得很好的降噪效果。

深度学习(Deep Learning):这类可以归于外部先验的子类,如果说解决逆问题的关键,是寻找一个好的图像约束器,那么我们为什么不用一个最好的约束器?深度学习方法的精髓,就在于通过大量的数据,学习得到一个高复杂度(多层网络结构)的图片约束器,从而将学习外部先验条件这一途径推到极限。近期的很多这类工作,都是沿着这一思路,取得了非常逆天的效果。

字符分割:就是把图片有用的部分一个个分割下来;字符分割有很多方法,但并不是每一种方法都是万能的,我们需要根据自己的业务来调整;常见的就是投影法和连通域法

投影法:就是分析每一维上黑色像素点的个数(假设是二值化的图像),然后设置一个阙值,根据这个阙值来分割图片

图像腐蚀、膨胀处理

腐蚀:图像的一部分区域与指定的核进行卷积,求核的最小值并赋值给指定区域。 腐蚀可以理解为图像中高亮区域的领域缩小。

膨胀:图像的一部分区域与指定的核进行卷积,求核的最大值并赋值给指定区域。 膨胀可以理解为图像中高亮区域的领域扩大。

字符的归一化:

就是将分割好的图像内的字符归一化到一个标准模板大小;归一化的理想结果就是:归一化到标准模板大小;倾斜校正;笔画宽度归一化;字形归一化。

注:
本文章参考了很多博客,感谢;主要是跟着一个博客来实现的https://blog.csdn.net/ysc6688/article/category/2913009(也是基于opencv来做的,只不过他是用c++实现的)感谢

Java基于opencv实现图像数字识别(二)—基本流程的更多相关文章

  1. Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  2. Java基于opencv实现图像数字识别(五)—投影法分割字符

    Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...

  3. Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

  4. Java基于opencv实现图像数字识别(一)

    Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用Buffere ...

  5. Java基于opencv实现图像数字识别(五)—腐蚀、膨胀处理

    腐蚀:去除图像表面像素,将图像逐步缩小,以达到消去点状图像的效果:作用就是将图像边缘的毛刺剔除掉 膨胀:将图像表面不断扩散以达到去除小孔的效果:作用就是将目标的边缘或者是内部的坑填掉 使用相同次数的腐 ...

  6. Java基于opencv—矫正图像

    更多的时候,我们得到的图像不可能是正的,多少都会有一定的倾斜,就比如下面的 我们要做的就是把它们变成下面这样的 我们采用的是寻找轮廓的思路,来矫正图片:只要有明显的轮廓都可以采用这种思路 具体思路: ...

  7. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  8. Java基于OpenCV实现走迷宫(图片+路线展示)

    Java基于OpenCV实现走迷宫(图片+路线展示) 由于疫情,待在家中,太过无聊.同学发了我张迷宫图片,让我走迷宫来缓解暴躁,于是乎就码了一个程序出来.特此记录. 原图: 这张图,由于不是非常清晰, ...

  9. 基于Opencv快速实现人脸识别(完整版)

    无耻收藏网页链接: 基于OpenCV快速实现人脸识别:https://blog.csdn.net/beyond9305/article/details/92844258 基于Opencv快速实现人脸识 ...

随机推荐

  1. elixir东游记:实现一个简单的中文语句解析

    备份:https://zhuanlan.zhihu.com/p/46030123 代码地址:github:pyzh/gdpl-ex.poc-1 原语句是:List1为'12332234':记a为Lis ...

  2. Linux c codeblock的使用(二):在工程中编译多个文件

    (一)前言 我们刚开始学习linux c的时候,一般都是在一个c文件里面写完所有程序,然后用gcc编译这个c文件就好了,十分简单. 但是你有没有想过,如果我们希望将不同模块的代码放到不同的c文件,然后 ...

  3. Spring使用ioc注解方式配置bean

    context层 : 上下文环境/容器环境 applicationContext.xml 具体示例: 现在ioc容器中添加context层支持: 包括添加xmlns:context.xsi:schem ...

  4. java求0~100的质数(素数)

    质数的概念: 简单的来说就是一个数从2开始取模到(求余数)自身的值,如果取模后余数一直不等于0那么这个数就是质数(素数). 如 7     7%2    7%3    7%4    7%5   7%6 ...

  5. hosts文件被修改后的惨案

    在公司MAC电脑上/etc/hosts中尝试反向解析一个ip到localhost, 即:xxx.xxx.xxx.xxx localhost 然后发现tomcat起不来;

  6. Context Encoder论文及代码解读

    经过秋招和毕业论文的折磨,提交完论文終稿的那一刻总算觉得有多余的时间来搞自己的事情. 研究论文做的是图像修复相关,这里对基于深度学习的图像修复方面的论文和代码进行整理,也算是研究生方向有一个比较好的结 ...

  7. C/C++(static)

    出自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html 静态全局变量作用范围在一个文件内,程序开始时分配空间,结束 ...

  8. C++笔记之关键字explicit

    在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: explicit 关键字只能用 ...

  9. ionic2APP 如何处理返回键问题

    1.APP中难免会有自定义各种modal.alert,modal或alert处于激活状态时android用户按物理返回键,页面被返回,而这些弹窗切没有被返回,一种解决办法是可以在每个组件内用生命周期钩 ...

  10. SharePoint Framework 在web部件中使用已存在的JavaScript库 - 捆绑打包和外部引用

    博客地址:http://blog.csdn.net/FoxDave 在构建SPFx客户端web部件时,你可以使用公网已有的JavaScript库来构建强大的解决方案.但是在使用的时候你需要考虑你引用的 ...