【导读】本文是专栏《计算机视觉40例简介》的第16个案例《KNN英文字母识别》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。 目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。 大家可以在公众号“计算机视觉之光”回复关键字【案例16】获取本文案例的源代码及使用的测试图片等资料。 针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。 |
本文截取书中部分内容如下:
KNN系统的工作流程如图1所示,其通常包含两个步骤:
- 步骤1:训练过程,完成训练模型的工作。
- 步骤2:测试过程,完成使用模型的工作。
图1 KNN工作流程
在使用OpenCV的KNN模块时,不能直接把图像传递给KNN模块。必须将图像处理为满足格式要求的数据形式。传递给KNN模块的测试数据或者训练数据,可以是行形式的(cv2.ml.ROW_SAMPLE),也可以是列形式的(cv2.ml.COL_SAMPLE)。
进一步说,传递给KNN模块的参数必须要体现两点:
- 1 充分体现原始图像的特征,并具备标签;
- 2 符合SVM对数据的要求;
例如,图2显示了在处理图像时,使用KNN模块工作的一般方式。图中各部分含义为:
- F1是特征提取运算。该模块负责从图像内提取图像的特征及标签。
- F2是表示输入训练数据。将训练数据传递给KNN模块。
- F3是表示输入测试数据。将测试数据传递给KNN模块。
- KNN是K近邻模块。
图2 识别流程
一般情况下,在将图像传递给KNN前,必须要通过特征提取的方式,将其转换为数值。本节中,我们的关注点在于如何使用KNN实现字符识别,因此,我们采用一个已经提取好特征的数据集。如图3所示,是我们所使用数据集“Letter Recognition”的部分数据。
图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个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。