写在前面
这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点。
而且因为在编写的过程中,把前面的一些逻辑也修改了一些,将其变得更完善了,所以一切以本篇的为准。当然,如果想要直接看代码,代码全部放在我的GitHub中,所以这篇文章主要负责讲解,如需代码请自行前往GitHub。
本次大纲
上一次写到了数据库的建立,我们能够实时的将更新的训练图片存入CSV文件中。所以这次继续往下走,该轮到识别图片的内容了。
首先我们需要从文件夹中提取出需要被识别的图片test.png,并且把它经过与训练图片相同的处理得到1x10000大小的向量。因为两者之间存在微小的差异,我也不是很想再往源代码之中增加逻辑了,所以我就直接把增加待识别图片的函数重新写一个命名为GetTestPicture,内容与GetTrainPicture类似,只不过少了“增加图片名称”这一个部分。
之后我们就可以开始进行正式图片识别内容了。
主要是计算待识别图片与所有训练图片的距离。当两个图片距离越近的时候,说明他们越相似,那么他们很有可能写的就是同一个数。所以利用这个原理,我们可以找出距离待识别图像最近的几个训练图片,并输出他们的数字分别是几。比如说我想输出前三个,前三个分别是3,3,9,那就说明这个待识别图片很有可能是3.
之后还可以对每一个位置加个权重,具体的就放在下一次再讲,本节内容已经够多了。
(第一篇文章之中我说过利用图片洞数检测。我尝试了一下,认为有些不妥,具体原因放在本文末。)
MAIN代码
所以直接把主要代码放上来,逻辑相对来说还是比较清晰的
import osimport OperatePicture as OPimport OperateDatabase as ODimport PictureAlgorithm as PAimport csv##Essential vavriable 基础变量#Standard size 标准大小N = 100#Gray threshold 灰度阈值color = 200/255n = 10#读取原CSV文件reader = list(csv.reader(open('Database.csv', encoding = 'utf-8')))#清除读取后的第一个空行del reader[0]#读取num目录下的所有文件名fileNames = os.listdir(r"./num/")#对比fileNames与reader,得到新增的图片newFileNamesnewFileNames = OD.NewFiles(fileNames, reader)print('New pictures are: ', newFileNames)#得到newFilesNames对应的矩阵pic = OP.GetTrainPicture(newFileNames)#将新增图片矩阵存入CSV中OD.SaveToCSV(pic, newFileNames)#将原数据库矩阵与新数据库矩阵合并pic = OD.Combination(reader, pic)#得到待识别图片testFiles = os.listdir(r"./test/")testPic = OP.GetTestPicture(testFiles)#计算每一个待识别图片的可能分类result = PA.CalculateResult(testPic, pic)for item in result: for i in range(n): print('第'+str(i+1)+'个向量为'+str(item[i+n])+',距离为'+str(item[i]))
新闻热点
疑难解答