橙狮AI图形识别(包含源码和资料)

本文详细介绍了字母识别的技术方案,包括图像在计算机中的表示、像素匹配、灰度转换、局部统计特征提取、字母有效区域提取等步骤。通过图像预处理,解决了光照、角度等因素对识别的影响,实现了在不同平台上的应用。文章还探讨了工程化过程中的图像校正、灰度化和二值化等关键环节。

一、技术方案

1、 图像在计算机中的表示方法

在计算机中,图像是由像素点组成,一个矩阵式的像素集合组成了一幅二维的图像。其中每个像素点由RGB成,其中R/G/B分别代表红/绿/蓝,也就是我们物理中所学的三原色,我们通过对RGB的值进行控制就可以组成我们所需要的任何颜色,一般而言R/G/B的取值范围在0-255,0代表最浅色(无色),255代表颜色最深色。

总结:我们可以理解为将一幅图像分成NxN的小格,我们使用3个0-255的数字来近似表示每一个小格中的颜色。一幅图像就可以转换为:

第一行{像素1,像素2,像素3...}
第二行{像素1,像素2,像素3...}
...
    
此时如果我们将每个像素的RGB值用16进制表示,并且进行移位合并(#BGR格式),一幅图像就可以变成二维数组的形式:
[#0A0CBB, #25D13A,...]
[#0A0CBB, #25D13A,...]
....

2、图像的像素匹配

如果要判断两幅图像(或者局部图像)的匹配,计算机没有人一样的感性思维逻辑,只能通过比对图像中对应位置的像素点来判断,举个简单的例子:

上图是两幅图像的局部像素表示,在计算机中需要分别将[1,2,3,4]与[a,b,c,d]处的像素做比较,然后根据对应像素的RGB值的差值来计算两幅图像的匹配度。

这样我们就可以设计一个简单的匹配算法,描述如下:

对于目标图像(x,y)处的像素P1和源图像(x,y)处的像素P2进行还原,得出RGB的值;
计算P1和P2的RGB差值分别为D1,D2,D3,为了增加鲁棒性,当|D1|+|D2|+|D3|<K1时认为匹配;
重复1-2步骤直至所有像素都计算完毕,匹配像素/总像素得出匹配率S,当S >0.7即为两图像匹配;

小结:像素匹配就是按照顺序彼此比较两幅图像中每一个像素点,可以视为将两幅图像进行减操作。

3、图像的灰度转换

现实生活中,由于角度,光线,光学传感器等因素的影响,即使我们在第二节设计的匹配算法中增加了两处鲁棒性处理,但几乎还是不能运行。而且当图片大的时候计算量奇大无比。

为了增加算法鲁棒性,我们需要对原图像进行其他的处理手段,其中一个重要的是灰度化,即将RBG的值映射到0-255的区间内,使用一个0-255的值表示一个像素点。

灰度的转换主流有三种方法:

  1. 最大值法:将彩色图像中的三分量亮度的最大值作为灰度图的灰度值2

  1. 平均值法:将彩色图像中的三分量亮度求平均得到一个灰度值。

  1. 加权平均法:根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。

在这里我们使用灰度图法将算法更新如下:

将目标图像和源图像转化为灰度图;
计算目标图像(x,y)处的像素P1和源图像(x,y)处的像素P2绝对差值D,当|D|<K1时认为匹配;
重复1-2步骤直至所有像素都计算完毕,匹配像素/总像素得出匹配率S,当S >0.7即为两图像匹配;

小结:图像的灰度转换是将彩色图像转为黑白图像,以增加光线和传感器差异带来的误差。

4、局部统计特征的提取

在第三节优化后的算法高度依赖像素的对应关系,如果角度稍有变化就会出现误差。为了解决以上问题我们可以通过提取图片的局部统计特征来增加算法的鲁棒性。

在提取局部特征之前,我们必须先将图像转化到同一大小,否则统计特征将失去意义,这里我们使用opencv的resize()函数对图像进行归一化。

归一化之后我们可以选取一个阈值将图像转化为二值图像,二值化有助于去除噪声凸显出字母的轮廓,二值化公式为:

如下图我们将归一化后图像分为3*3的像素集合(图像均分为9块),然后求取每个集合中的1的个数,这样我们就可以得到一个9维的数组来表示这个图像,我们称这个9维数组为图像的特征向量。

既然是向量我们就可以使用欧式距离来表示两向量的距离:

在这里我们更新算法:

将目标图像和源图像转化为灰度图,然后通过resize转化为相同大小;
选取一个阈值,一般选取128(需要根据灰度方法选择)将图像转化为二值图;
将图像均分为3*3的像素集合,计算每个像素集合中的1的个数,组成一个9维的向量特征
根据欧式距离公式计算两向量的距离S,当S >某值 即为两图像匹配;

小结:图像二值化是将图像转化为0和1的集合,这中可以去除一些轻微的噪声,并且将有效信息凸显出来。特征提取就是将图像局部的信息按照一定的规则描述出来。

5、字母有效区域提取

对于字母而言在转化成二值图像之后,如图,每个字母都是可以认为是一个由1组成的联通区域,我们根据8临域可以将有效区域提取出来,然后在归一化之后可以解决识别的尺寸不一致问题。

8临域法可以简单理解为:像素为1的点视为通路可以通过,为0的点视为断路不能通过,从一个可通过的点,然后找到从该点可以到达的所有点,组成的就是一个整体;

使用某个标记一个未被标记的像素值为1的像素点;
检测该点周围临近8个像素点中所有值为1的像素点,对未标记的点进行标记;
循环对于所有的标记点周围进行8临域检测,直到所有标记点周围8个临域内没有未被标记的1;
这时得到的所有标记点是一个整体。

小结:因为字母在图像中肯定是相互连通的一个区域,我们可以用这一特征将字母的有效数据提取出来,这样可以避免一些背景中的强噪声引起的误匹配。

6、方案总述

到这里我们通过一系列简单的推导,完成了一个简易的字母识别的算法。但是这个算法到应用还有以下问题需要克服或者说存在以下缺陷/限制:

  1. 所要识别的字母成像的最小像素有一定的要求,并且字母成像方向要与模板相同;
  2. 对于动态识别中,光照和阴影会很影响识别,需要最大限度过滤掉光照/阴影的噪声影响;
  3. 对于有一定倾斜角的摄像头,要根据倾斜角计算出透视矩阵将图像转化为正视角。

二、工程化

1、 软硬件简介

如图是机器人摄像头的结构示意图,这种结构采集到的图像存在一定的夹角,需要使用算法进行纠正。

我们使用的图像处理库为opencv,开发语言为C++。使用C++可以将算法快速在Android,IOS和linux之间迁移。

2、 图像校正

从我们的硬件结构可以看出,摄像头采集的图像并不会垂直视角的,而是存在一定的夹角,虽然这样我们也是套用上篇文章的方法进行匹配,但是识别率会有所损失,因此我们这里先对图像进行一个矫正处理。

如图,左面是原始图像的示意图,右侧为我们所希望得到的图像示意图。

这里我们使用单应矩阵对图像进行一次透视变换。公式为:

其中u,v为像素在原始图像的坐标,x',y'为像素在转换之后图像中的坐标。

单应矩阵计算方法为,使用摄像机拍摄个矩阵,如上图所示,然后带入公式中得到

使用最小二乘法即刻得出对应的单应矩阵T。

3、 图像灰度化与二值化

使用公式:

将采集到的图像转换为灰度图。

为了去除光照和阴影对二值化的影响,我们还要使用同态高斯滤波对灰度图进行一次滤波,过滤掉高频和低频的部分。同态滤波过程如下:

其中x,y为像素的坐标;

In表示一次对数操作;

DFT表示一次傅里叶变换;

H(u,v)表示一个高斯滤波器;

表示一次反傅里叶变换;

exp表示一次取值操作;

g(x,y)为最终过滤之后的图像数据;

然后我们将过滤之后的灰度图使用如下公式转化为二值图

其中b(x,y)为转换之后的二值图像数据;

T1为选定的阀值;

转化成二值图之后,我们再进行一次闭操作去除二值图像上的裂缝噪声。

闭操作:

步骤1: 构建一个3*3的单元,使用该单元与每个像素进行'与'操作,如果中心像素为1,则周围8个像素都设置为1

步骤2:构建一个3*3的单元,使用该单元与每个像素进行'与'操作,如果周围8个临域像素中有0,则该像素为0

闭操作之后,我们使用8临域法得到每个图像域,然后对图像于进行归一化操作。

至此图像的预处理完成。

4、 统计特征的提取与匹配

再经过第三节部分描述之后的操作,我们可以得到很多的图像域块,但是并不是每一个图像域都是我们需要的,这里我们使用以下方法进行简单的过滤:

将待匹配图像与模板图像进行一次与操作(因此比对每一个像素),如果对应位置都为1,则计数器加1
循环所有像素得到两个图像的同为1的点数,然后计算出重合的比例,当这个比例小于50%时,丢弃该图像域。

通过以上步骤我们可以过滤掉大部分不符合的图像域,减少了一些不必要的计算,使得再嵌入式平台上也能有很好的时效性。

对于通过过滤的图像,我们进行统计特征的提取,如图,我们统计每个方格中1点的个数,组成一个9维的向量值。

这里我们使用的是3*3的划分,如果平台算计比较强悍的话可以进行4*4的划分。

计算完特征向量之后,我们使用以下公司计算该向量与模板向量之间的欧式距离:

此时我们只要设置一个S的参考值,就可以得到一个比较准确的识别结果。

5、总结

通过第2到4节,我们将字母识别算法进行了工程化的部署,当然还会存在以下局限性:

  1. 字母的图像最小分辨率为30px;
  2. 字母需要实现制作模板;
  3. 算法对旋转比较敏感;

联系我们,欢迎关注公众号“橙狮科技”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值