当前位置: 华文星空 > 知识

如何写一个简单的手写识别算法?

2015-04-02知识

正好手头有个demo,这里尽量用最简单的思路介绍一下。

说明,这个是给零基础的同学看的,不需要任何计算机基础。

同样,这个处理思路忽略了非常多的细节,只是为了让大家更好地理解原理而已。

1。首先看下如何提取特征,看这么多数字,眼睛都花了。

2。简单说就是把数字划分成很多很多的小块,比如下图这样:

每个数字被划分成了4*5=20个小块。

分好了小块以后,其实我们要知道每个小块是由很多个像素构成的。

或者这样理解,每个小块其实可以划分为更多的小块,即每个小块是由很多个更小的块构成的。

比如每个小块可能是100*100个更小的小块构成的。

为了叙述上的方便,把小块记为B(Bigger),更小的块记为S(Smaller)。

因此,比如数字8,是由5行4列共计:5*4=20个小块B构成。

每个小块B内其实是由100*100=100000个像素(更小块S)构成的。

3。数一下每个小块B内,有多少个黑色的像素。

或者这样理解,每个小块B内有多少个更小块S是黑色的。

比如第一行:

  • 第1个小块B中,共有0个更小块S是黑色的,记为0.
  • 第2个小块B中,共有28个更小块S是黑色的,记为28.
  • 第3个小块B中,共有10个更小块S是黑色的,记为10.
  • 第4个小块B中,共有0个更小块S是黑色的,记为0.
  • 以此类推,可以计算出每一行的每一个小块B的数字是多少,写好就好了。

    这就是数字的特征,如果仔细观察,每个数字的特征是不一样的。

    因为他们的每个小块B内的数字是不一致的。

    4。为了方便,我们把得到的特征,排成一排(数组)就好了。

    5。所以,我们可以看看数字8的特征,其实就是一堆数字(数组)构成的。

    6。照着葫芦画瓢,每个数字的特征其实都是一堆数字构成的。

    这个数字类似于我们的身份证号码,一般来说,是独一无二的。

    7。那识别是怎么回事呢?

    就是比较要识别的数字特征和步骤6中的哪个数字的特征最接近就好了。

    这里为了方便,假设要识别数字「8」,然后看看怎么从一堆(为了方便只有两个)数字里面选出来他到底应该是几?

    8。当然,为了方便,特征简化了,我们假设每个数字只有4个特征值了。

    9。这里要用到一个欧氏距离的概念。

    简单点说,就是有一个罪犯,经过警察叔叔的缜密侦查,发现他的身高 是175cm(通过脚印就可以判断出身高,大家自己百度一下)。

    警察过来抓人了,两个已知嫌疑人,一个A身高176cm,另外一个B身高168厘米。

    那我计算一下,取绝对值就好了:

  • A与嫌疑人的差值:176-175=1cm
  • B与嫌疑人的差值:175-168=7cm
  • 那当然,罪犯就是身高176cm的A了。

    当然,由于当前不仅仅有身高,还有体重,那就要综合计算身高和体重了。

    为了更好地计算,就用到公式:

    看起来很复杂,简单说就是把所有的差值取平方和后开根号。

    这就是一种计算方法,不理解原理其实也没有关系,总之就是计算一下,知道怎么计算就行了。

    10。看看罪犯和嫌疑人的相似程度。

    好了,计算一下要识别的这个图像(图中待识别右侧的8,这里我们假装不认识他)和数据库里面保存的数字8的欧式距离吧!

    恩,计算就是把每个对应的特征值相减,取平方,计算和,开根号。

    得到结果,当前结果是根号3.

    11。再次计算罪犯和另外一个嫌疑人的相似程度。

    好了,计算要识别的图像和数据库里面的数字7的特征值进行比较。

    恩,绿色部分是我们的计算结果,根号7322.

    12。识别

    罪犯和嫌疑人的计算差异值,一个是根号3,另外一个是根号7322.

    距离小的是识别结果。

    这里,根号3是识别结果,所以,要识别的图像是数字8.

    这就是识别过程了。

    可以用图表示一下:

    在提取特征前,图像可能是彩色的,就先把他处理为二值的,这样好方便计算其中黑色小块的个数。

    写得比较匆忙,欢迎大家对细节提出改进意见。谢谢。

    版权所有,转载请私信联系。

    本文已经写入【OpenCV轻松入门】(电子工业出版社,2019)、【计算机视觉40例】(电子工业出版社,2022)。