| 【导读】本文是专栏《计算机视觉40例简介》的第16个案例《KNN英文字母识别》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。 目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。 大家可以在公众号“计算机视觉之光”回复关键字【案例16】获取本文案例的源代码及使用的测试图片等资料。 针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。 |
本文截取书中部分内容如下:
KNN系统的工作流程如图1所示,其通常包含两个步骤:

图1 KNN工作流程
在使用OpenCV的KNN模块时,不能直接把图像传递给KNN模块。必须将图像处理为满足格式要求的数据形式。传递给KNN模块的测试数据或者训练数据,可以是行形式的(cv2.ml.ROW_SAMPLE),也可以是列形式的(cv2.ml.COL_SAMPLE)。
进一步说,传递给KNN模块的参数必须要体现两点:
例如,图2显示了在处理图像时,使用KNN模块工作的一般方式。图中各部分含义为:

图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个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。
