导读】本文是专栏《计算机视觉40例简介》的第16个案例《KNN英文字母识别》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。

目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。

大家可以在公众号“计算机视觉之光”回复关键字【案例16】获取本文案例的源代码及使用的测试图片等资料。

针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。

本文截取书中部分内容如下:

KNN系统的工作流程如图1所示,其通常包含两个步骤:

  1. 步骤1:训练过程,完成训练模型的工作。
  2. 步骤2:测试过程,完成使用模型的工作。

【计算机视觉40例】案例16:KNN英文字母识别_opencv

图1 KNN工作流程

在使用OpenCV的KNN模块时,不能直接把图像传递给KNN模块。必须将图像处理为满足格式要求的数据形式。传递给KNN模块的测试数据或者训练数据,可以是行形式的(cv2.ml.ROW_SAMPLE),也可以是列形式的(cv2.ml.COL_SAMPLE)。

进一步说,传递给KNN模块的参数必须要体现两点:

  1. 1 充分体现原始图像的特征,并具备标签;
  2. 2 符合SVM对数据的要求;

例如,图2显示了在处理图像时,使用KNN模块工作的一般方式。图中各部分含义为:

  1. F1是特征提取运算。该模块负责从图像内提取图像的特征及标签。
  2. F2是表示输入训练数据。将训练数据传递给KNN模块。
  3. F3是表示输入测试数据。将测试数据传递给KNN模块。
  4. KNN是K近邻模块。

【计算机视觉40例】案例16:KNN英文字母识别_python_02

图2 识别流程

一般情况下,在将图像传递给KNN前,必须要通过特征提取的方式,将其转换为数值。本节中,我们的关注点在于如何使用KNN实现字符识别,因此,我们采用一个已经提取好特征的数据集。如图3所示,是我们所使用数据集“Letter Recognition”的部分数据。

【计算机视觉40例】案例16:KNN英文字母识别_python_03

图3 字符特征集

我们所使用的数据集“Letter Recognition”中,每一行包含17个字符,对应着一个字符的图像。每一行中,第1个字符是对应字符图像的标签,其余16个数值都是对应字符图像的特征值。各个字符的含义如表1所示。

表1字符含义表

位数

含义

位数

含义

1

标签,26个大写字母(A~Z)

10

包围字符的盒中像素在y方向方差

2

包围字符的盒的水平位置

11

x/y相关性(针对第7位、第8位)

3

包围字符的盒的垂直位置

12

水平方差与垂直方向的相关性

4

包围字符的盒的宽度

13

垂直方差与水平方向的相关性

5

包围字符的盒的高度

14

从左到右的平均边缘计数

6

字符包含像素总数

15

垂直方向边缘和

7

包围字符的盒中像素在x方向均值

16

从下到上的平均边缘计数

8

包围字符的盒中像素在x方向均值

17

水平方向边缘和

9

包围字符的盒中像素在x方向方差



上述特征值是字符的重要属性,例如第14位上特征值衡量“从左到右的平均边缘计数”,能够衡量“W”、“M”与“T”、“I”的区别。

在《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书中,从算法原理、实现流程等角度系统深入地介绍了该案例的理论基础和实现过程,并对具体的代码实现进行了细致的介绍与解释。欢迎大家阅读第16章《KNN字符识别》获取详细内容。

《计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。

【计算机视觉40例】案例16:KNN英文字母识别_计算机视觉40例_04