1、70|电子制作 2023 年 2 月软件开发0 引言在日新月异的当代社会,经济和科技的快速发展使得人们的物质文化生活也越来越多元化。为了使得后来者也能见证某一特定的时间节点或保留某一美好的场景,人们常会通过拍照的方式将场景以图片的形式进行保留。然而在日常生活中,人们常常会遇到对同一运动的物体进行快速多次拍摄取证后,产生模糊无效图片的情况。若选择后期以人工方式挑选时,则需要花费大量时间和精力对相关图片进行逐一比对,不利于以人为本的发展思想的体现和劳动效率的提升。因此,随着现代科学技术的快速发展,我们也应该不断用探索用新的方式来解决日常生活以及工作应用中的此类繁琐、单一、重复性的工作,从而提高工作
2、效率和解放生产力。通过查阅资料可知,当前国内外针对模糊图像的识别处理方法主要存在以下缺点:(1)算法仅针对某一特定图片进行模糊与否的判断,不能批量识别并处理模糊图片。当需要对其他图片进行识别处理时,需要更改算法或者手动控制更换图片;(2)利用图像分割算法,建立由多尺度输入的U 形网络和一组多尺度特征提取器构建的模型检测和判定模糊图像1。该方法识别较为准确但是构建模型过程复杂且难度较高,不利于推广;(3)先对模糊图片进行滤波等清晰化处理,再将处理后的图片加以利用。该方案也仅能对单一图像进行处理,不具有批量处理图片的能力。且在不断迭代的众多算法中,哪一种算法更能行之有效地解决实际问题,还需要在更多
3、的实际案例中不断地进行检验,发现问题并加以优化。针对以上问题,本算法设计采用拉普拉斯算子对图像进行模糊度判别,通过 Python 语言编写批量识别处理模糊图片的算法逻辑,从而达到本算法的设计目的。1 算法基本原理区分清晰图片和模糊图片的基本思想为:图像中各线条之间的边缘不明确,且图像中边缘模糊的部分占图片大部分,有小部分线条模糊的图片不能判定为模糊图片。因此,在机器学习领域可以通过拉普拉斯算法来检测图片是否模糊。即利用拉普拉斯算法在输入图片中查找图像边缘2,计算图像方差和已过滤图像像素值的最大值。方差值大表明图像边缘清晰可见,即可判定为图像清晰;若图像方差值小则判定为图像模糊。批量处理图像的基
4、本思想为:通过读取目标文件夹预存图片信息过程中保留图片张数信息,以便算法进行和图片张数相同次数的循环处理,从而达到遍历所有图片的目的。同时,在图片遍历过程中调用拉普拉斯算法计算图片方差值,用于与阈值进行比较,达到清晰与模糊的判别目的。再通过自主编写的功能函数 doWork()进行相应的标记处理,以此达到批量处理的目的。为了给使用者更加直观便捷地了解处理结果,特采用 matplotlib.pyplot 绘制可视化界面3,将处理后的图片以 cv2.imwrite()函数另存文件夹的同时以弹窗形式进行集中展示。为了便于调试和检验该算法设计是否有效,本次验证过程仅使用对运动的同一物体快速抓拍后的 12
5、 张图片进行调试和验证处理。后续实际应用过程中若想批量处理更多的图片,即在目标图像库添加预处理目标图像即可。1.1 拉普拉斯算法拉普拉斯算法又称为拉普拉斯梯度函数。理解梯度函数需要理解梯度的作用:梯度表示某一个函数在某一点的方向导数沿着该点方向的最大值,即函数在该点沿着该方向变化速度最快,变化率最大。本次设计过程即调用 OpenCV 库内置的拉普拉斯函数计算图片的方差值,再在后续处理过程中判定图片是否模糊4。该算法的主要思想为:先将图像转换为灰度图像,然后单一通道的灰度图像经过刚才计算出来的拉普拉斯 33 卷积核计算后会得到一个响应图,最后再计算这个响应图的方差。基于该方差和预先经过调试设定的
6、阈值进行比较,就可以判断图像是否模糊,也即是通过图像灰度数据的方差来衡量图像的清晰度。对于同一对象的一组图片,可以采用同一个阈值进行判定;不同的对象、不同环境下拍摄的图片可能需要根据实际情况相应的调整阈值。拉普拉斯梯度函数与使用 Tenengrad 梯度方法计算图像梯度值的使用方式基本一致,Tenengrad 梯度方法为利用 Sobel算子分别计算水平和垂直方向的梯度,若图像在同一背景条件下的梯度值越高,表明图像越清晰。即衡量的指标是经过基于拉普拉斯算子的模糊图片批量检测算法设计喻浩,吴丰林(电子科技大学成都学院 智能制造工程系,四川成都,611731)摘要:为了解决在日常生活中,对同一运动目
7、标进行快速多次拍摄后,难以逐一挑选模糊图片的问题,特提出了一种基于拉普拉斯算法的模糊图片批量检测算法设计。该算法基于OpenCV库进行开发,运用Python语言逻辑建立算法结构并验证及最终实现设计。经实际运行效果表明,该算法设计对模糊图片的识别速度快、判别准确,具有一定的实际应用能力和使用价值。关键词:拉普拉斯算法;模糊图片检测;OpenCV库;PythonDOI:10.16589/11-3571/tn.2023.03.019wwwele169com|71软件开发Sobel 算子处理后的图像的平均灰度值,值越大代表图像越清晰。在使用时可直接用拉普拉斯梯度函数替代 Sobel 算子5。在图像处理
8、的应用方面,因平面图像可以视为 x 和 y 两个方向的像素点聚集排列而成且是离散分布的,所以需要将拉普拉斯算子方程表示为其在 x,y 两个方向的离散形式。其离散一阶微分方程为:(1)()ff xf xx=+其离散二阶微分方程为:22(1)(1)2()ff xf xf xx=+拉普拉斯算子的离散方程为:2222(1,)(1,)(,1)(,1)4(,)fff xyf xyf x yxyf x yf x y+=+转换为卷积核表示如下:010141010而基于拉普拉斯梯度函数的图像清晰度的定义如下所示:()|(,)|(,)D fyx G x yG x yT=其中 G(x,y)是像素点(x,y)处拉普拉
9、斯算法的卷积,T是预先给定的边缘检测阈值。1.2 matplotlib.pyplot 介绍Matplotlib 是 Python 的一个绘图库,是 Python 语言中最常用的可视化工具之一,可以非常方便地创建 2D 图表和一些简单的 3D 图表6。且能够以各种硬复制格式和跨平台的交互式环境生成出版质量级别的图形7。在通过Matplotlib 进行绘图操作时,使用者可以仅依靠编写几行代码便可以生成所需要的条形图、饼图、功率谱、直方图、散点图等。同时,它还提供了一套和 Matlab 类似的命令API,十分适合交互式地进行制图,而且也可以方便地将它作为绘图控件,嵌入 GUI 应用程序中8。本次算法
10、设计即利用 Matplotlib 中 plt 工具绘制可视化界面,将处理结果以弹窗形式展示出来。涉及的函数简介如图 1 所示。1.3 图片库遍历过程图片的遍历逻辑通过 Python 语言构建,该过程在自主编写的功能函数 matplotlib_multi_pic1()中实现。通过 cv2.imread()函数读取图片,其形参 images 的值由(Pathimages+/+imgListi)得 到。Pathimages 为 图 片库的绝对路径,通过主动赋值得到。imgListi 的值通过os.listdir(path)函数赋值得到。os.listdir(path)函数作用是得到指定路径下所有文件
11、和文件夹的名字,并可将其存放于列表中,以此便得到了图片命名信息。通过 len(imgList)即可得到图片数量,借助该数值进行相应次数的 For 循环,即可完成图片库的遍历过程。图 1 plt 函数介绍2 算法实现的具体流程(1)对图片信息进行采集。该过程是利用 os.listdir()函数读取图片相关路径信息并赋值给自定义变量 imgList。变量 imgList 其作用是以形参的形式为自定义函数 matplotlib_multi_pic1()提供图片参数信息,使该函数在对图片进行批量处理过程得到图片参数信息,以使得处理后的图片在另存文件夹时能保留原文件命名方式和利用 len(imgList
12、)语句得到图片数量,以便于进行相应次数的图片遍历。(2)通过 PathImage=rimage/语句得到目标图片库的绝对路径,其作用是为函数 matplotlib_multi_pic1()提供形参的值,以便于 doWork()函数对某一具体图片进行相应处理。(3)调 用 matplotlib_multi_pic1()函 数。其 具 体流程及作用为:该函数有形参 imgList 和 PathImage,在该函数中,imgList 提供的值用于得到遍历次数和为图片提供命名信息;PathImage 提供图片绝对路径,以便于doWork()函数读取并处理具体的图片。同时在该函数中设置 for 循环对图
13、片进行遍历。(4)调用自定义的 doWork()函数。该函数的具体流程及作用为:读取图片并将其转换为灰度图,将灰度图传递至 variance_of_laplacian()函数中,使用 OpenCV 库自带的函数 cv2.Laplacian()进行拉普拉斯方差值计算,得到图片具体的方差值。将得到的方差值与模糊阈值相比较判断其是否为模糊图片,若方差值大于阈值则可判定其清晰并标记为“Not Blurry”,小于阈值则可判定为模糊图片并标记为“Blurry”,最后返回处理完成的图片。其中,标记文字的72|电子制作 2023 年 2 月软件开发过程利用 cv2.FONT_HERSHEY_SIMPLEX
14、命令实现,利用cv2.putText()函数对图片进行处理结果展示。整个算法实现即为各个函数互相调用的结果,程序运行过程如图 2 所示。图 2 程序运行流程图3 程序运行结果展示当用户在图像目标库 image 文件夹中存入需要批量检测的图像源文件后,即可直接运行该算法进行模糊图像批量检测处理的任务。目标图像库预留文件方式如图 3 所示。图 3 目标图像库在该算法运行完成后,即主动弹出可视化弹窗供用户可在不打开图像处理后另存文件夹 User 的条件下,直接对检测处理完成的结果进行比对,以便呈现出更加直观的处理效果。在弹出的效果图中每一块小区域的图片左上角均标记有相应图片通过拉普拉斯算法计算出的图
15、像方差的具体值,如果该值大于预先设定的阈值 80 就会标记 NotBlurry 和计算出的,如果小于 80 就会显示 Blurry 和图像具体方差值。这样就能够非常直观地看到所有图片经过拉普拉斯算法计算得到的具体方差值和设定的比较标准之间的信息,由此方便后续数据的进一步处理和使用。可视化弹窗效果如图4所示。通过 Python 编写语言逻辑,可以使得算法在处理单张图片过程完成后即主动向 User 文件夹存放处理完成的图片的功能循环。处理完成后的图片左上角均标记有该图像是否模糊以及图像方差值具体参数。根据实际应用需要,也可以通过修改 Python 语言逻辑实现仅对判别出的模糊图片进行标记处理,清晰
16、图片仅识别而不标记的功能,从而达到保护清晰图像的目的。修改方法简单,将清晰图片对应的阈值比较语句下实现标记内容的文本 text 和图像方差值 fm 屏蔽即可,即不对图像方差值高于阈值的图片进行标记处理。为了更好地验证算法处理结果是否准确,在本次算法验证过程中采用全部标记处理的方式验证最终结果。图像批量处理后得到的文件夹 User 如图 5 所示。图 4 可视化弹窗效果 图 5 图像批量处理后得到的文件夹为了更好地展示本算法的图片分辨及标记处理效果,特单独拿出处理后的模糊图像和清晰图像各一张进行对比。通过对比可以发现,清晰的图像方差值高,模糊的图像方差值低,且标记无误。图像对比如图 6 所示。图 6 图像对比4 总结本文设计并实现了基于拉普拉斯算子的模糊图片批量检测算法。经过实际应用检验,表明该算法设计在批量处理图片过程中具有算法运行速度快、模糊与清晰图片判别准确(下转第 55 页)wwwele169com|55信息工程测试时,先将小车放在盒子架空,插上电源,然后通过电脑远程登录树莓派,在电脑上控制树莓派运行 Python 程序,观察摄像头是否正常,再把打印出来的二维码放到摄像头前进行识