目录
前言
一、KNN原理
二、数字识别系统效果演示
三、数字识别系统
1.图像采集
2.阈值分割--(定位数字区域)
3.轮廓特征分析--(定位数字区域)
4.数字轮廓提取
5.扩充边界并归一化其尺寸
6.训练数据集并预测测试样本
总结
前言
本章使用一个基于 MINIST 的小型数据集通过OpenCV中的 KNN 方法进行从0到9数字识别,由于数据集小,不能完全识别正确,经测试其识别正确率能达到 90%以上。这数字识别系统基本完成,但其适应性还有所欠缺,比如任意角度书写数字情况也能够高正确率识别。由于笔者能力局限,再加上参与(海南)疫情抗战 导致时间仓促,特此提供本系统的所有工程代码,详细说明步骤,让大家继续深入开发,共同进步。
一、KNN原理
KNN(K-NearestNeighbor)的任务就是在训练本集中,依据距离测度找到与测试样本最相似的K个训练样本,对于分类问题,大多采用“多数表决”的方式确定测试样本的最终分类,即在这K个训练样本中,属于那个类别的样本数最多,测试样本就属于那个类。
我们常说:“物以类聚,人以群分”。相似的东西我们就归为一类,人的一生有三个阶段,幼年、成年、老年。通过年龄大小的进行分类,比如我们现在要判断一个人处于说明阶段,就要通过其年龄大小进行分类。KNN原理可以这样通俗理解。
二、数字识别系统效果演示
本系统任务是在一个普通的环境下找出数字区域并识别出数字。本系统是在学习桌面上进行演示系统的效果,其效果图如图所示。
三、数字识别系统
1.图像采集
本系统使用海康的MV-EB435i悉灵相机,其图像采集效果通过GIF图演示。其性能强大,且轻盈便携。
2.阈值分割--(定位数字区域)
由于我们在一个普通环境下,并非是复杂环境下进行定位,为此定位方法也简单,笔者采用阈值分割进行图像分析,将前景与背景区分开。在阈值分割方法中,其最常用的方法是大津法分割,其效果是较理想的,当然,其方法也不是万能的,你也知道,没有一种方法是万能的,只有较好的。
大津法(OTSU)是一种自动选择阈值(无参数且无监督)的的图像分割方法,日本学者 Nobuyuki Otsu 1979年提出。该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。
算法原理:①.首先假设阈值为 K(0-255),然后根据K值将灰度图分为两部分,前景与背景。
②.计算前景与背景占整幅图的比例。P前景 与 P背景。其之和为1。
③.算出属于前景/背景/全景中均值(灰度值),M前景、M背景与M全景。
④.根据Otsu的算法原理,求类间方差。
⑤.从0-255遍历K,计算每个K对应的间类方差,最大方差对应的K值即为阈值。
代码如下(示例):
//大津法二值化
namedWindow("binary", 0);
resizeWindow("binary", 640, 360);
Mat binary;
threshold(grayImg,binary,0,255,THRESH_OTSU);
imshow("binary",binary);
通过使用大津法对采集的灰度图像进行阈值分割,其效果图如下。
3.轮廓特征分析--(定位数字区域)
前面将采集的图像进行二值化,我们要通过OpenCV中findContours函数进行轮廓分析,通过轮廓特征(面积,长宽比等特征)提取最大轮廓(我们假定最大轮廓包含数字)并在原图中做出标记与提取。笔者对最大轮廓进行最小外接正/斜矩形。
其效果如下图所示:
4.数字轮廓提取
对最大轮廓的外接斜矩形(原图中的蓝色矩形)进行灰度值翻转操作即可。代码实现思路是遍历最小外接正矩形内区域所有点(原图中的红色区域)判断点是否为外接斜矩形区域,如果属于且该点的灰度值为 0 即为数字轮廓的点。将其灰度值翻转为255即可。
其效果如图所示:
5.扩充边界并归一化其尺寸
由于我们的训练数据集中采用归一化尺寸,对测试样本也要进行归一化。其尺寸统一归一化为20像素*20像素,其归一化后效果如图所示。
6.训练数据集并预测测试样本
本文使用的小型数据集是从MINST中随机挑选出数字0-9的图片各500张,每张图片按比例缩小为20像素*20像素,然后将这5000张图片拼成一张整图,MINIST数据集如图所示。
对这些样本作为训练集,创建并初始化KNN模型,训练分割好的训练集,然后将前面我们已经提取处理的数字区域作为测试样本进行测试,获取其预测结果,将其标注在原图中。其效果如图所示。
总结
以上就是本系统采用的方案,本系统充其量为小儿科水平,其局限性较大,比如我们要解决在任意角度下也能够高正确识别出数字。因为一个企业级项目考虑条件是非常复杂的,我深知自己的能力不足,欠缺考虑复杂条件,所以让我们共同学习,共同进步。本系统所有代码待笔者整理好再分享给大家,就这样了,抗击疫情去了(海南),2022/8/22 21:10,海南加油,新盈加油。