目录

前言

背景与意义

技术思路

最后💯


前言

        📅大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为选题耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

        🚀对毕设有任何疑问都可以问学长哦!

        本次分享的课题是

        🎯基于深度学习的数字识别算法的应用

背景与意义

        在当今数字化时代,各种数据以数字的形式呈现和记录,如财务报表、统计数据、身份识别号码等。对这些数字进行快速、准确的识别和处理,对于提高信息处理效率、实现自动化办公和数据管理至关重要。卷积神经网络(CNN)等深度模型能够自动学习图像的特征表示,具有强大的特征提取和分类能力,在图像识别任务上取得了显著优于传统方法的性能表现。这为数字识别提供了新的思路和技术手段,推动了基于深度学习的数字识别算法的研究和应用。通过对基于深度学习的数字识别算法的研究,可以深入探索深度学习模型在数字图像特征学习、表示和分类方面的理论机制,进一步完善计算机视觉中的图像识别理论体系,为相关领域的研究提供理论支持和参考。

技术思路

        数字分割旨在从图像中提取数字,其原理基于图像阈值法。先将图像转换为灰度图,通过设定阈值,把灰度值小于该阈值的像素归为一类,大于的归为另一类,从而得到仅含两种颜色(通常为黑白)的二值图像。在 OCR 应用里此方法较为有效,不过关键在于确定合适的阈值,可手动选择常量,也可借助 OpenCV 采用自适应阈值,后者对不同光照情况(如扫描气泵图像)有优势,能依据图像局部确定不同阈值。

        基本图像处理流程如下:以原始图像为起点,尽管可能存在眩光点但相对干净。首先运用图像阈值法得到二值图像,接着利用 OpenCV 的 findContours 方法找出白色像素连接区域,绘制轮廓后裁剪这些区域,进而判断其是否为数字以及具体是哪个数字,通过这一系列步骤逐步将原始图像分解为单个数字。

        在进行图像处理之前,调整图像的属性是提升处理效果的关键一步。通过实验发现,适当调整图像的曝光度(或称阿尔法值)能够显著改善结果。我们可以对图像进行曝光调整,从而增强图像的亮度和对比度。这一过程为后续的图像处理流程奠定了良好的基础,确保我们能够获得更清晰、更准确的图像数据,为后续分析和处理提供更为可靠的输入。

        在进行图像处理的初期,调整图像属性是提升最终效果的重要步骤。通过实验,我们发现适当调整图像的曝光度(阿尔法值)能够显著增强图像的亮度和对比度,为后续处理奠定了良好的基础。在获取更清晰的图像后,接下来的步骤是将图像转换为灰度图,这样可以减少计算的复杂性并突出重要特征。随后,我们对图像进行了模糊处理,以降低噪点的影响。经过多次尝试,我们发现轻微的模糊效果能够达到最佳结果,既能保留边缘信息,又能有效抑制噪声。最后,我们使用cv2.adaptiveThreshold方法将图像转换为黑白图像,采用cv2.ADAPTIVE_THRESH_GAUSSIAN_C选项,并通过调整块大小和常数值来优化阈值处理,尽管这一过程需要一定的试验和错误,但它为后续的图像分析提供了稳定的基础。

        在处理燃油泵的7段LCD显示屏图像时,由于数字之间存在微小的间隙,传统的轮廓绘制方法难以准确识别这些数字。为了使数字看起来更加连贯,我们采用了侵蚀技术(erode),这有助于填补这些间隙。在这种情况下,我们侵蚀了白色背景,以便使黑色数字显得更大更完整。随后,我们进行了颜色反转操作,因为在使用findContours方法查找轮廓之前,需要将图像中的颜色反转,使得白色区域连接在一起,而当前的数字是黑色。因此,通过反转图像,我们能够确保findContours能成功找到数字的连接部分。

        在反转颜色后,我们可以在图像上找到轮廓。下图展示了原始图像及其每个轮廓的包围框,虽然成功识别出了数字,但也找到了许多非数字的部分。因此,接下来需要对这些检测到的轮廓进行过滤,以排除那些不相关的部分。通过这些步骤,我们为后续的数字识别和处理打下了基础,确保了识别过程的准确性和有效性。

        在找到图像中的轮廓后,我们需要对这些轮廓进行过滤,以识别出我们关心的数字部分。虽然初步识别成功找到了数字,但也检测到了许多非数字的轮廓,因此我们必须应用一套快速规则来筛选出潜在的数字轮廓。首先,我们会收集所有被分类为正方形或高矩形的轮廓。然后,剔除任何不符合这些形状特征的轮廓,以确保剩下的部分是我们需要分析的对象。

        接下来,我们会根据轮廓的长宽比进一步过滤。通过观察气泵的显示,我们发现LCD显示屏中的数字大多数都具有相似的长宽比。例如,数字“0”到“9”的长宽比大约为0.6,而数字“1”的长宽比略低,为0.3。我们将使用这些比率及其±缓冲区来判断轮廓是否符合要求,同时收集这些潜在的数字轮廓。此外,我们还会应用一组额外的规则,确保这些轮廓的边界高度与其他潜在数字的平均高度或垂直位置相一致。由于数字的大小应该保持一致并在同一Y坐标上对齐,因此任何偏离平均高度的轮廓都将被丢弃,从而进一步提高数字识别的准确性。通过这些步骤,我们能够有效地提取出图像中的数字部分,为后续的处理和识别打下坚实的基础。

        在预测阶段,我们将利用识别出的两个等高线轮廓,一个代表潜在的整数位,另一个代表潜在的小数位,来裁剪图像,并将这些区域输入到经过训练的系统进行值的预测。与此同时,识别小数点是另一个需要解决的问题。由于小数点通常较小,并且可能与周围的手指相连,使用传统的方法可能会导致困难。在之前的轮廓过滤过程中,我们收集了可能是小数的正方形轮廓。在获取已验证的数字轮廓后,我们将确定数字的最左和最右x坐标,以便找出预期的小数点位置。接着,我们会遍历所有潜在的小数点,检查其是否在预定空间内及其下半部分,以将其分类为小数。一旦找到小数点,我们就可以将其插入到之前预测的数字字符串中,从而完成数字的整体识别和预测过程。

        在机器学习中,解决OCR(光学字符识别)问题被视为一个分类问题,我们通过建立一个训练有素的数据集来实现这一目标。这个数据集包括经过处理的数字图像,每个图像都被分类为特定的数字。我们利用这些数据来匹配任何新的图像。一旦基本的图像隔离功能建立起来,我便创建了一个脚本,该脚本能够遍历图像文件夹,执行数字隔离代码,并将裁剪后的数字保存到新的文件夹中,以便后续查看。运行完成后,我会得到一个未经训练的数字文件夹,这些图像将用于训练我们的系统。

        由于OpenCV已内置k近邻(k-NN)算法的实现,因此无需引入其他库来进行训练。我们会浏览数字裁剪后的文件夹,并将每个图像放入按数字标记的文件夹中(例如,0-9),确保每个文件夹中都有该数字的不同版本。虽然我们收集的图像数量并不庞大,但足以支持可行的训练。考虑到这些数字的标准化特征,我相信不需要大量的训练数据就能实现较高的识别准确率。

        k-NN的基本工作原理是,我们将每个图像以黑白方式加载,并将图像的每个像素状态(开或关)存储在一个数组中。每个打开或关闭的像素将与特定的数字相关联。当我们需要预测一个新图像时,算法会找出哪个训练图像与这些像素状态最匹配,并返回最接近的数字值。

        整理好数字图像后,我将编写一个新的脚本,遍历这些文件夹,逐个获取每个图像并将其与相应的数字进行关联。到目前为止,尽管在Python和C++中实现的图像处理概念相似,但在具体代码中会存在一些细微的差别。这一整理流程确保了训练数据的有效性,为后续的数字识别奠定了坚实的基础。

🚀海浪学长的作品示例:

大数据算法项目

机器视觉算法项目

 

微信小程序项目

Unity3D游戏项目

最后💯

🏆为帮助大家节省时间,如果对开题选题,或者相关的技术有不理解,不知道选题如何下手,都可以随时来问学长,我将根据你的具体情况,提供帮助。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐