win10+Python3.7.3+OpenCV3.4.1入门学习(二十章 K近邻算法)————20.3 手写数字识别的原理

Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm

20.3 手写数字识别的原理

20.1节我们仅仅取了两个特征维度进行说明。在实际应用中,可能存在着更多特征维度需要计算。下面以手写数字识别为例进行简单的介绍。
假设我们要让程序识别图20-2中上方的数字(当然,你一眼就知道是“8”,但是现在要让计算机识别出来)。识别的方式是,依次计算该数字图像(即写有数字的图像)与下方数字图像的距离,与哪个数字图像的距离最近(此时k=1),就认为它与哪幅图像最像,从而确定这幅图像中的数字是多少。
在这里插入图片描述

下面分别从特征值提取和数字识别两方面展开介绍。
1.特征值提取
步骤1:我们把数字图像划分成很多小块,如下图所示。该图中每个数字被分成5行4列,共计5×4=20个小块。此时,每个小块是由很多个像素点构成的。当然,也可以将每一个像素点理解为一个更小的子块。
为了叙述上的方便,将这些小块表示为B(Bigger),将B内的像素点,记为S(Smaller)。因此,待识别的数字“8”的图像可以理解为:
● 由5行4列,共计5×4=20个小块B构成。
● 每个小块B内其实是由M×N个像素(更小块S)构成的。为了描述上的方便,假设每个小块大小为10×10=100个像素。

在这里插入图片描述

步骤2:计算每个小块B内,有多少个黑色的像素点。或者这样说,计算每个小块B内有多少个更小块S是黑色的。
仍以数字“8”的图像为例,其第1行中:
● 第1个小块B共有0个像素点(更小块S)是黑色的,记为0。
● 第2个小块B共有28个像素点(更小块S)是黑色的,记为28。
● 第3个小块B共有10个像素点(更小块S)是黑色的,记为10。
● 第4个小块B共有0个像素点(更小块S)是黑色的,记为0。
以此类推,计算出数字“8”的图像中每一个小块B中有多少个像素点是黑色的,如图20-4所示。我们观察后会发现,不同的数字图像中每个小块B内黑色像素点的数量是不一样的。正是这种不同,使我们能用该数量(每个小块B内黑色像素点的个数)作为特征来表示每一个数字。
在这里插入图片描述

步骤3:有时,为了处理上的方便,我们会把得到的特征值排成一行(写为数组形式),如下图所示。

在这里插入图片描述

当然,在Python里完全没有必要这样做,因为Python可以非常方便地直接处理上图中上方数组(array)形式的数据。这里为了说明上的方便,仍将其特征值处理为一行数字的形式。
经过上述处理,数字“8”图像的特征值变为一行数字,如下图所示。

在这里插入图片描述

步骤4:与数字“8”的图像类似,每个数字图像的特征值都可以用一行数字来表示。从某种意义上来说,这一行数字类似于我们的身份证号码,一般来说,具有唯一性。
按照同样的方式,获取每个数字图像的特征值,如下图所示。

在这里插入图片描述

2.数字识别
数字识别要做的就是比较待识别图像与图像集中的哪个图像最近。这里,最近指的是二者之间的欧氏距离最短。
本例中为了便于说明和理解进行了简化,将原来下方的10个数字减少为2个(也即将分类从10个减少为2个)。假设要识别的图像为下图中上方的数字“8”图像,需要判断该图像到底属于图20-8中下方的数字“8”图像的分类还是数字“7”图像的分类。
在这里插入图片描述

步骤1:提取特征值,分别提取待识别图像的特征值和特征图像的特征值。
为了说明和理解上的方便,将特征进行简化,每个数字图像只提取4个特征值(划分为2× 2=4个子块B),如图下所示。此时,提取到的特征值分别为:
● 待识别的数字“8”图像:[3, 7, 8, 13]
● 数字“8”特征图像:[3, 6, 9, 12]
● 数字“7”特征图像:[8, 1, 2, 98]

在这里插入图片描述

步骤2:计算距离。按照20.1节介绍的欧氏距离计算方法,计算待识别图像与特征图像之间的距离。
首先,计算待识别的数字“8”图像与下方的数字“8”特征图像之间的距离,如下图所示。计算二者之间的距离:
在这里插入图片描述
在这里插入图片描述

接下来,计算待识别的数字“8”图像与数字“7”特征图像之间的距离,如下图所示。二者之间的距离为:

在这里插入图片描述
在这里插入图片描述

通过计算可知,待识别的数字“8”图像:
● 与数字“8”特征图像的距离为√3。
● 与数字“7”特征图像的距离为√7322。
步骤3:识别。
根据计算的距离,待识别的数字“8”图像与数字“8”特征图像的距离更近。所以,将待识别的数字“8”图像识别为数字“8”特征图像所代表的数字“8”。
上面介绍的是K近邻算法只考虑最近的一个邻居的情况,相当于K近邻中k=1的情况。在实际操作中,为了提高可靠性,需要选用大量的特征值。例如,每个数字都选用不同的形态的手写体100个,对于0~9这10个数字,共需要100×10=1000幅特征图像。在识别数字时,分别计算待识别的数字图像与这些特征图像之间的距离。这时,可以将k调整为稍大的值,例如k=11,然后看看其最近的11个邻居分属于哪些特征图像。例如,其中:
● 有8个属于数字“6”特征图像。
● 有2个属于数字“8”特征图像。
● 有1个属于数字“9”特征图像。
通过判断,当前待识别的数字为数字“6”特征图像所代表的数字“6”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值